2017-01-31 5 views
0

私は10行を挿入する一時テーブルを持っています。一時テーブル内の行に対して合計を実行し、上部に合計行をロールアップとして表示する方法はありますか。

彼らは次のようになります。

COL1 COL2   COL3 
Jobs ALL SALARIES AVG SALARIES 
19  $2,286,232.00 $285,779.00 -- THIS IS THE SUMMARY ROW AT THE TOP 
0  0    0 
1  $386,156.00  $96,539.00 
2  $923,520.00  $153,920.00 
1  $626,200.00  $469,650.00 
7  $2,772,400.00 $440,000.00 
0  0    0 
3  $2,203,200.00 $61,200.00 
1  $153,000.00  $102,000.00 
3  $1,752,816.00 $213,783.00 
1  $408,000.00  $204,000.00 

行1は、ロールUP行で、すべてがこの順であることが必要であるが、第1回の行が合計行であり、あなたが見ることができるように、それは正しくありません。

ROW 1がこのようになります。

19  $11,682,164.00 $217636.50 

私は SUM行っています(数値CONVERT((18,2)を、COL2))OVER()COL2 とAVGが(CONVERT (数値として(18,2)、col3))col3として

しかし、わかるとおり、正しくありません。

注:$とは、元のSQLにはありません。わかりやすくするためにそこに入れています。

最後に、ここでは、上記の準正しいを生成SQLは...だ

select TOP(9) PW_WAGE_LEVEL, 
     CONVERT(numeric(18,2),CASE WHEN WAGE_RATE_OF_PAY_TO = '0.00' THEN 
      CASE WHEN ANNUALIZED_SALARY = '0.00' THEN 
       CASE WHEN pw_unit_of_pay = 'year' THEN 
        CAST(REPLACE(WAGE_RATE_OF_PAY_FROM,',','') as numeric) 
       END 
      ELSE 
       CAST(REPLACE(MIDPOINT_WAGE_RATE,',','') as numeric) 
      END 
     ELSE 
      CASE WHEN WAGE_RATE_OF_PAY_TO = '0.00' THEN 
       CASE WHEN pw_unit_of_pay = 'hour' THEN 
        CAST(REPLACE(ANNUALIZED_SALARY,',','') as numeric) 
       ELSE 
        CAST(REPLACE(ANNUALIZED_SALARY,',','') as numeric) 
       END 
      ELSE 
       CASE WHEN WAGE_RATE_OF_PAY_TO > '0.00' THEN 
        CASE WHEN pw_unit_of_pay = 'hour' THEN 
         CASE WHEN ANNUALIZED_SALARY = '0.00' THEN 
          CAST(REPLACE(MIDPOINT_WAGE_RATE,',','') as numeric) 
         ELSE 
          CAST(REPLACE(ANNUALIZED_SALARY,',','') as numeric) 
         END 
        END 
       END 
      END 
     END * pw_wage_level) as ttlWagesPerLevel, 
     SUM(CONVERT(numeric(18,2),CASE WHEN WAGE_RATE_OF_PAY_TO = '0.00' THEN 
      CASE WHEN ANNUALIZED_SALARY = '0.00' THEN 
       CASE WHEN pw_unit_of_pay = 'year' THEN 
        CAST(REPLACE(WAGE_RATE_OF_PAY_FROM,',','') as numeric) 
       END 
      ELSE 
       CAST(REPLACE(MIDPOINT_WAGE_RATE,',','') as numeric) 
      END 
     ELSE 
      CASE WHEN WAGE_RATE_OF_PAY_TO = '0.00' THEN 
       CASE WHEN pw_unit_of_pay = 'hour' THEN 
        CAST(REPLACE(ANNUALIZED_SALARY,',','') as numeric) 
       ELSE 
        CAST(REPLACE(ANNUALIZED_SALARY,',','') as numeric) 
       END 
      ELSE 
       CASE WHEN WAGE_RATE_OF_PAY_TO > '0.00' THEN 
        CASE WHEN pw_unit_of_pay = 'hour' THEN 
         CASE WHEN ANNUALIZED_SALARY = '0.00' THEN 
          CAST(REPLACE(MIDPOINT_WAGE_RATE,',','') as numeric) 
         ELSE 
          CAST(REPLACE(ANNUALIZED_SALARY,',','') as numeric) 
         END 
        END 
       END 
      END 
     END) * pw_wage_level) OVER() as ttlWages, 
     SUM(pw_wage_level) OVER() as ttlPTFTJobs 
from myFirstTempTable 
where worksite_state = 'RI' 
and JOB_TITLE like '%accountant%' 
group by pw_unit_of_pay,pw_wage_level,ANNUALIZED_SALARY 

UPDATE:

実際のスキーマは、TEMP表に、このようで来ている :

USE [myFirstTempDB] 
GO 
/****** Object: StoredProcedure [dbo].[usp_call_homepage_report] Script Date: 1/9/2017 10:07:52 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[usp_call_homepage_report]   
    @wsCity varchar(255), 
    @wsState varchar(10), 
    @pwUOP varchar(10), 
    @jobTitle varchar(255) 

    AS 
     BEGIN 

     --CREATE A TEMP TABLE first... we need somewhere to stick the data 
     IF OBJECT_ID ('tempdb..#tempHomePageResults') is not null 
     drop table #tempHomePageResults 

     DECLARE @tempHomePageResults TABLE (
      TotalNbrPTandFTJobs varchar(50), 
      TotalAnnualWages varchar(50), 
      TotalAvgSalary varchar(50)) 

       INSERT INTO @tempHomePageResults 
       execute usp_row1_homePageReport @wsCity,@wsState,@pwUOP,@jobTitle 
       --BLANK ROW - FULL TIME SPECIALTY JOBS... 
       INSERT INTO @tempHomePageResults 
       (TotalNbrPTandFTJobs, TotalAnnualWages,TotalAvgSalary) 
       VALUES(1,0,0) 
       --SKILL LEVEL ROWS! 
       --FT JOB SKILL LEVEL ROWS!    
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'Y',1 
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'Y',2 
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'Y',3 
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'Y',4 
       --BLANK ROW - PART TIME SPECIALTY JOBS... 
       INSERT INTO @tempHomePageResults 
       (TotalNbrPTandFTJobs, 
       TotalAnnualWages,TotalAvgSalary) 
       VALUES(2,0,0) 
       --SKILL LEVEL ROWS! 
       --PT JOB SKILL LEVEL ROWS!    
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'N',1 
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'N',2 
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'N',3 
       INSERT INTO @tempHomePageResults 
       execute usp_row1_6_HomePageReport @wsCity,@wsState,@pwUOP,@jobTitle,'N',4       

       SELECT * FROM @tempHomePageResults 

END 

注:これは正規化されていないことを理解していますが、CSVからSQL SERVERへのクイックインポートであり、TIME CRUNCHがあります。

はおそらく正しいデータ型を正規化するために適しだろう:

INT NUMERIC(18,2) NUMERIC(18,2)

は、正規化されたデータは、このようであると仮定:

COL1 COL2   COL3 
Jobs ALL SALARIES AVG SALARIES 
19  2286232.00  285779.00 -- THIS IS THE SUMMARY ROW AT THE TOP 
0  0    0 
1  386156.00  96539.00 
2  923520.00  153920.00 
1  626200.00  469650.00 
7  2772400.00  440000.00 
0  0    0 
3  2203200.00  61200.00 
1  153000.00  102000.00 
3  1752816.00  213783.00 
1  408000.00  204000.00 

これは私を助けるのに役立ちます。

おかげ

+0

2つのもの: 1)実際のスキーマとデータを提供します。 2)クエリをクリーンアップして、すべてのフォーマット情報を削除します。 答えを提供する方が簡単です。 –

+0

UPDATEは役に立ちますか? –

答えて

1

は、ここに私の答えだ:それは上部に合計行を置くことは簡単です。問題は、他の行はどのように表示されるのでしょうか?あなたの一時テーブルには、残りの行に対して信頼できるソートを生成することはできません。特定の順序で行を挿入するだけで、それらが同じ順序で出てくることは期待できません。これは私たちがTotalAnnualWages DESC BY

シンプル

ORDERだろう。しかし、私はあなたがそれらを挿入するために、他の行をしたいと思います。行ってそれと

CREATE TABLE dbo.tempHomePageResults (
     ID INTEGER IDENTITY(1,1) PRIMARY KEY , 
     TotalNbrPTandFTJobs INTEGER, 
     TotalAnnualWages NUMERIC(12,2), 
     TotalAvgSalary NUMERIC(12,2)) 

、最初の最大行をreutrnすれば、以下の通りとあとがきその後、すべての行だから、

WITH CTE AS 
(SELECT res.TotalNbrPTandFTJobs, res.TotalAnnualWages, res.TotalAvgSalary, 
ROW_NUMBER() OVER(ORDER BY res.TotalAnnualWages DESC) AS RN, 
res.ID 
FROM dbo.tempHomePageResults res 
) 
SELECT cte.TotalNbrPTandFTJobs, cte.TotalAnnualWages, cte.TotalAvgSalary 
    FROM CTE 
ORDER BY CASE WHEN cte.RN =1 THEN RN ELSE 2 END, 
    cte.ID 

、このよう最大行:だから、私はあなたのテーブルにID列を追加します(RN = 1)が最初に来て、それを挿入した順に1行おきになります。 ADAMのANSWER FOR

UPDATE:に関するADAMの最後のコメントと私FOR

enter image description here

UPDATE - ウィンドウ表示機能のみBY句SELECTまたはORDERに表示されます。

このステートメントは、最後のINSERTを@tempHomePageResultsテーブルに挿入した後、最後の "END"ステートメントの前に表示されます。 (上のコードを参照)

  BEGIN 
       UPDATE @tempHomePageResults SET 
        TotalAnnualWages = CAST(SUM(CONVERT(numeric(18,2),TotalAnnualWages)) OVER() as varchar), 
        TotalAvgSalary = AVG(CAST(CONVERT(numeric(18,2),TotalAvgSalary) as varchar)) 
       WHERE h1bID = 0 
      END 
+0

アダム、これを今チェックして、私の友人。ありがとう... "CTEとは何ですか?"私の無知を許しなさい。私が得ているのは、このエラーメッセージです。キーワード 'with'に誤りがあります。この文が共通テーブル式、xmlnamespaces句または変更追跡コンテキスト句である場合、前の文はセミコロンで終了する必要があります。 –

+0

CTEへの私の答えが見つかりました:Common Table Expression(CTE)(SQL内)は、SELECT、INSERT、UPDATE、またはDELETEステートメントの実行スコープ内で定義された簡単なクエリから派生した一時的な名前付き結果セットです。 CTEは、派生テーブル(サブクエリ)、ビュー、およびインラインユーザー定義関数の代替として考えることができます。 –

+0

だから、アダム、私はまだCTEに関する私の最初のコメントでエラーを理解しようとしています。今、すべてのテスト。 –

関連する問題