2017-09-12 4 views
0

動的ピボットで2クーリンから合計と2小計を使用してクエリを作成しようとしています。ダイナミックピボットSQLで1を超えるサブ合計する方法

私はこの

enter image description here

CREATE TABLE #SampleData 
 
(
 
    Class varchar(10), 
 
    Name varchar(10), 
 
    Location varchar(10), 
 
    Item varchar(10), 
 
    temp varchar (10) 
 
) 
 

 
INSERT INTO #SampleData 
 
VALUES 
 
('abc', 'Ron', 'A', 'Pencil', '12345'), 
 
('abc', 'Ron', 'A', 'Pen', '2345'), 
 
('abc', 'Tom', 'C', 'Pencil', '34343'), 
 
('abc', 'Tom', 'D', 'Pencil', '252525'), 
 
('def', 'Ron', 'E', 'Pen', '35345'), 
 
('def', 'Tom', 'F', 'Pencil', '87878'), 
 
('def', 'Tom', 'G', 'Pen', '9876'), 
 
('ghi', 'Ron', 'H', 'Pen', '09090'), 
 
('ghi', 'Ron', 'I', 'Pen', '40404'), 
 
('ghi', 'Tom', 'J', 'Pencil', '144442345'), 
 
('ghi', 'Tom', 'K', 'Pencil', '4444333') 
 

 

 
DECLARE @Pivot_Columns AS VARCHAR(MAX), 
 
     @select_Columns VARCHAR(max) 
 

 
SELECT @Pivot_Columns = Stuff((SELECT DISTINCT ',' + Quotename(item) FROM #SampleData FOR xml path('')), 1, 1, '') 
 
SELECT @select_Columns = Stuff((SELECT DISTINCT ',Sum(' + Quotename(item) + ') as '+Quotename(item) FROM #SampleData FOR xml path('')), 1, 1, '') 
 

 
DECLARE @SQL AS VARCHAR(MAX) 
 

 
SET @SQL = 'SELECT case when grouping(name) = 1 and grouping(class) = 0 then ''Total''+ '' '' + class 
 
when grouping(name) = 1 and grouping(class) = 1 then ''Total'' 
 
else class end class, name, location, temp,' 
 
      + @select_Columns + ' 
 
FROM 
 
(
 
    SELECT class, name, location, item, temp 
 
    FROM #SampleData 
 

 
) as PivotData 
 
PIVOT 
 
(
 
    count(item) 
 
    for item IN (' 
 
      + @Pivot_Columns + ') 
 
) AS PivotResult 
 
group by class, name, location, temp with rollup 
 
' 
 

 
EXEC(@SQL)

のようなテーブル&クエリを持っており、どのようにこのようなデータを作成するために? enter image description here

Iクラス&小計クラスに基づいて名前からわずかたいショーの小計が、私の最初のイメージャに一時に基づいてサブの合計があります。私が 'クラス別にグループ化すると、ロールアップで名前を付けました。'というエラーが表示されます。

ありがとうございました。

答えて

1

(私はちょうど見直し最初のケースを、名前のためのCASEを追加して、コメントを追加HAVING条件):

SET @SQL = 'SELECT 
        case when grouping(name) = 1 and grouping(class) = 0 then ''TOTAL ''+ '' '' + class 
         when grouping(name) = 1 and grouping(class) = 1 then ''TOTAL ''      
         else class end class 
      , case when grouping(location)=1 AND grouping(temp)=1 THEN ''TOTAL ''+name 
         else name end name, location, temp,' 
      + @select_Columns + ' 
FROM 
(
    SELECT class, name, location, item, temp 
    FROM #SampleData 

) as PivotData 
PIVOT 
(
    count(item) 
    for item IN (' 
      + @Pivot_Columns + ') 
) AS PivotResult 
group by class, name, location, temp with ROLLUP 
HAVING (grouping(location)=1 AND grouping(temp)=1) OR (grouping(location)=0 AND grouping(temp)=0 AND grouping(name)=0 AND grouping(class)=0) 
' 

更新:

同じ結果(以前のクエリでHAVING条件を使用しないでください)を取得すると、GROUPING SETSを使用できます。

SET @SQL = 'SELECT 
        case when grouping(name) = 1 and grouping(class) = 0 then ''TOTAL ''+ '' '' + class 
         when grouping(name) = 1 and grouping(class) = 1 then ''TOTAL ''      
         else class end class 
      , case when grouping(location)=1 AND grouping(temp)=1 THEN ''TOTAL ''+name 
         else name end name, location, temp,' 
      + @select_Columns + ' 
FROM 
(
    SELECT class, name, location, item, temp 
    FROM #SampleData 

) as PivotData 
PIVOT 
(
    count(item) 
    for item IN (' 
      + @Pivot_Columns + ') 
) AS PivotResult 
group by GROUPING SETS ((class,name), (class), (class, name, location, temp),()) 

' 

出力:

+------------+-----------+----------+-----------+-----+--------+ 
| class | name | location | temp | Pen | Pencil | 
+------------+-----------+----------+-----------+-----+--------+ 
| abc  | Ron  | A  | 12345  | 0 |  1 | 
| abc  | Ron  | A  | 2345  | 1 |  0 | 
| abc  | TOTAL Ron | NULL  | NULL  | 1 |  1 | 
| abc  | Tom  | C  | 34343  | 0 |  1 | 
| abc  | Tom  | D  | 252525 | 0 |  1 | 
| abc  | TOTAL Tom | NULL  | NULL  | 0 |  2 | 
| TOTAL abc | NULL  | NULL  | NULL  | 1 |  3 | 
| def  | Ron  | E  | 35345  | 1 |  0 | 
| def  | TOTAL Ron | NULL  | NULL  | 1 |  0 | 
| def  | Tom  | F  | 87878  | 0 |  1 | 
| def  | Tom  | G  | 9876  | 1 |  0 | 
| def  | TOTAL Tom | NULL  | NULL  | 1 |  1 | 
| TOTAL def | NULL  | NULL  | NULL  | 2 |  1 | 
| ghi  | Ron  | H  | 09090  | 1 |  0 | 
| ghi  | Ron  | I  | 40404  | 1 |  0 | 
| ghi  | TOTAL Ron | NULL  | NULL  | 2 |  0 | 
| ghi  | Tom  | J  | 144442345 | 0 |  1 | 
| ghi  | Tom  | K  | 4444333 | 0 |  1 | 
| ghi  | TOTAL Tom | NULL  | NULL  | 0 |  2 | 
| TOTAL ghi | NULL  | NULL  | NULL  | 2 |  2 | 
| TOTAL  | NULL  | NULL  | NULL  | 5 |  6 | 
+------------+-----------+----------+-----------+-----+--------+ 
+0

私はすでにSETSをグループ化してみたが、私のクエリがうまく機能していない... とあなたのクエリがそんなにありがとううまく働きました。 –

0

this linkが役に立ちます。ここ

または、別のソリューションです:私はあなたがこの試すことができると思い

SELECT SUM(CASE WHEN Code = '01' THEN Value1 ELSE 0 END) AS Value1_01 
    ,SUM(CASE WHEN Code = '02' THEN Value1 ELSE 0 END) AS Value1_02 
    ,SUM(CASE WHEN Code = '01' THEN Value2 ELSE 0 END) AS Value2_01 
    ,SUM(CASE WHEN Code = '02' THEN Value2 ELSE 0 END) AS Value2_02 
FROM TableName 
関連する問題