2017-01-12 11 views
0

私は、列CalDate、OrderID、SalesAmount、LocRecIDを持つテーブルRPT_DailySalesSummaryを持っています。SQL Server 2012の列と行の合計を持つ動的ピボットテーブル

 
CalDate OrderID SalesAmount LocRecID 
2016-12-01 R101 100   81 
2016-12-01 R102 120   81 
2016-12-01 R113 150   82 
2016-12-01 R104 130   85 
2016-12-02 R205 250   81 
2016-12-02 R106 104   82 
2016-12-02 R112 80   85 
2016-12-02 R032 80   85 

以下の結果表を、各カレンダーの日付ごとの位置ID別に出力したいとします。 (注:位置の番号は動的です)

 
CalDate  81 82 85 Total 
2016-12-01 220 150 130 500 
2016-12-02 250 104 160 514 
Total  470 254 290 1014 

以下のコードは、ピボットテーブルを出力できますが、行と列の合計は出力できません。

DECLARE @cols  NVARCHAR(MAX)='' 
DECLARE @query  NVARCHAR(MAX)='' 

SELECT @cols = @cols + QUOTENAME(LocRecID) + ',' 
FROM (SELECT DISTINCT LocRecID FROM dbo.RPT_DailySalesSummary) AS tmp 
SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols)) 


SET @query = 
      'SELECT * FROM 
      (
        SELECT CalDate, SalesAmount, LocRecID 
        FROM dbo.RPT_DailySalesSummary 
      ) src 
      PIVOT 
      (
        SUM(SalesAmount) FOR LocRecID IN (' + @cols + ') 
      ) piv' 

execute(@query) 

PIVOTの使い方がわかりにくく、実際には理解できません。期待通りの結果を出すためにコードをどのように継続しているのか分かりません。

誰でも手助けできますか?どうもありがとうございます。

答えて

0

あなたの質問からこの

スキーマのように試してみてください。

CREATE TABLE #RPT_DailySalesSummary (
    CalDate DATE 
    ,OrderID VARCHAR(10) 
    ,SalesAmount INT 
    ,LocRecID INT 
    ) 

INSERT INTO #RPT_DailySalesSummary 
SELECT '2016-12-01', 'R101', 100,   81 
UNION ALL 
SELECT '2016-12-01', 'R102', 120,   81 
UNION ALL 
SELECT '2016-12-01', 'R113', 150,   82 
UNION ALL 
SELECT '2016-12-01', 'R104', 130 ,   85 
UNION ALL 
SELECT '2016-12-02', 'R205', 250 ,   81 
UNION ALL 
SELECT '2016-12-02', 'R106', 104,   82 
UNION ALL 
SELECT '2016-12-02', 'R112', 80 ,   85 
UNION ALL 
SELECT '2016-12-02', 'R032', 80 ,   85 

そして、あなたは準備列リストにあなたのように

DECLARE @cols  NVARCHAR(MAX)='' 
DECLARE @query  NVARCHAR(MAX)='' 
DECLARE @COLS_SUM NVARCHAR(MAX)='' 
DECLARE @COLS_TOT NVARCHAR(MAX)='' 

--Preparing columns for Pivot 
SELECT @cols = @cols + QUOTENAME(LocRecID) + ',' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary) AS tmp 
SELECT @cols = SUBSTRING(@cols, 0, LEN(@cols)) 

--Preparing sum of columns for Totals Horizontal 
SELECT @COLS_SUM = @COLS_SUM + QUOTENAME(LocRecID) + '+' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary) AS tmp 
SELECT @COLS_SUM = ','+ SUBSTRING(@COLS_SUM, 0, LEN(@COLS_SUM)) +' AS TOTAL' 

--Preparing sum of individual columns for Totals Vertically 
SELECT @COLS_TOT = @COLS_TOT +'SUM('+ QUOTENAME(LocRecID) + '),' 
FROM (SELECT DISTINCT LocRecID FROM #RPT_DailySalesSummary) AS tmp 
SELECT @COLS_TOT = SUBSTRING(@COLS_TOT, 0, LEN(@COLS_TOT)) 



SET @query = 
      'SELECT *'[email protected]_SUM+' INTO #TAB FROM 
      (
        SELECT CalDate, SalesAmount, LocRecID 
        FROM #RPT_DailySalesSummary 
      ) src 
      PIVOT 
      (
        SUM(SalesAmount) FOR LocRecID IN (' + @cols + ') 
      ) piv 

      SELECT * FROM #TAB 
      UNION ALL 
      SELECT NULL AS TOTAL ,'[email protected]_TOT+',SUM(TOTAL) FROM #TAB 

      ' 

execute(@query) 

の列のSUMを準備する必要があり、その結果が

になります
╔════════════╦═════╦═════╦═════╦═══════╗ 
║ CalDate ║ 81 ║ 82 ║ 85 ║ TOTAL ║ 
╠════════════╬═════╬═════╬═════╬═══════╣ 
║ 2016-12-01 ║ 220 ║ 150 ║ 130 ║ 500 ║ 
║ 2016-12-02 ║ 250 ║ 104 ║ 160 ║ 514 ║ 
║ NULL  ║ 470 ║ 254 ║ 290 ║ 1014 ║ 
╚════════════╩═════╩═════╩═════╩═══════╝ 
+0

ありがとうとても。私はT-SQLのGROUP BY ROLLUP機能が同じことをしているのを見て、私のケースにどのように適用できますか? –

+0

最後の共用体allを削除し、最初の選択にロールアップを適用します –

関連する問題