如何在动态pivot sql中小计超过1个
我试图在DynamicPivot中创建一个查询,其中包含来自2个coulin的总计和2个小计 我有这样的表和查询 创建表SampleData varchar10类, 名字是varchar10, 地点:varchar10, 项目10, 温度varchar 10 插入样本数据 价值观 ‘abc’、‘Ron’、‘A’、‘Pencil’、‘12345’, “abc”,“Ron”,“A”,“Pen”,“2345”, ‘abc’、‘汤姆’、‘C’、‘铅笔’、‘34343’, ‘abc’、‘汤姆’、‘D’、‘铅笔’、‘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’、‘汤姆’、‘J’、‘铅笔’、‘144442345’, ‘ghi’、‘汤姆’、‘K’、‘铅笔’、‘4444333’ 将@Pivot_列声明为VARCHARMAX, @选择\u列VARCHARmax 选择@Pivot_Columns=StuffSELECT DISTINCT',“+Quotenameitem FROM SampleData FOR xml path,1,1, 从xml路径1,1的SampleData中选择@SELECT_Columns=StuffSELECT DISTINCT',将“+Quotenameitem+”和“+Quotenameitem+”作为“+Quotenameitem, 将@SQL声明为VARCHARMAX 设置@SQL=”在groupingname=1和groupingclass=0时选择大小写,然后选择Total++类 当groupingname=1且groupingclass=1时,则为Total else类结束类、名称、位置、临时、 +@select_Columns+' 从…起 选择类别、名称、位置、项目、临时 从样本数据 作为数据透视 支点 计数项 对于' +@Pivot_Columns+' 结果 按类别、名称、位置、临时和汇总分组 ' EXEC@SQL你可能会发现这很有帮助 或者,这里有另一个解决方案:如何在动态pivot sql中小计超过1个,sql,sql-server,pivot,Sql,Sql Server,Pivot,我试图在DynamicPivot中创建一个查询,其中包含来自2个coulin的总计和2个小计 我有这样的表和查询 创建表SampleData varchar10类, 名字是varchar10, 地点:varchar10, 项目10, 温度varchar 10 插入样本数据 价值观 ‘abc’、‘Ron’、‘A’、‘Pencil’、‘12345’, “abc”,“Ron”,“A”,“Pen”,“2345”, ‘abc’、‘汤姆’、‘C’、‘铅笔’、‘34343’, ‘abc’、‘汤姆’、‘D’、
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
我想你可以试试这个,我刚刚回顾了第一个案例,为name添加了一个案例,并添加了HAVING conditions:
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条件:
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 |
+------------+-----------+----------+-----------+-----+--------+
我已尝试对集合进行分组,但我的查询无法正常工作。。你的问题很好,非常感谢。