如何在动态pivot sql中小计超过1个

如何在动态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’、

我试图在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你可能会发现这很有帮助

或者,这里有另一个解决方案:

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 |
+------------+-----------+----------+-----------+-----+--------+

我已尝试对集合进行分组,但我的查询无法正常工作。。你的问题很好,非常感谢。