在将交叉表查询放入SQL Server时,我已经阅读了一些这些问题和答案。我试过这样做,但是我遇到了错误。
简单的例子就是我在m& m包上有一个条形码我想要一个SQL Server数据透视表,如果您将在下面获取此信息并将其转换为显示该行的查询标题作为条形码,列标题作为不同的颜色。
我有一个
的qry / table| Package Barcode | Color | SomNmr
| 12345 | BLUE | 3
| 12345 | RED | 3
| 12345 | YELL | 3
| 19999 | BLUE | 24
| 19999 | BLUE | 24
| 19999 | PINK | 24
| 19999 | RED | 24
| 19999 | RED | 24
当我运行交叉表查询向导时,我使用以下选项运行它:
您想要哪些字段值作为行标题?
我选择套餐条码
您想要哪些字段值作为列标题?
我选择颜色
您希望为每个列和行交叉点计算多少个数字?
我选择 SomNmr 和 COUNT
的功能交叉表完全符合我的要求:
我查看了SQL代码并将其粘贴到SQL Server Management Studio中,但是我遇到了一些错误。
TRANSFORM Count(Table1.[SomNmr]) AS CountOfSomNmr
SELECT Table1.[Package Barcode], Count(Table1.[SomNmr]) AS [Total Of SomNmr]
FROM Table1
GROUP BY Table1.[Package Barcode]
PIVOT Table1.[Color];
如何让它在SQL Server上运行?我正在环顾四周并阅读有关使用案例但我似乎无法正确应用以使其正常工作。任何帮助表示赞赏。
我制作了一个视频,深入解释了如果有人想看到我的内容我会发现如何在这里发布。
答案 0 :(得分:1)
假设你需要DYNAMIC
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Color) From YourTable Order by 1 For XML Path('')),1,1,'')
Select @SQL = '
Select [Package Barcode],[Total],' + @SQL + '
From (
Select [Package Barcode],B.[Color],B.[Cnt]
From YourTable A
Cross Apply (
Select Color=A.Color,Cnt=1
Union All
Select Color=''Total'',Cnt=1
) B
) A
Pivot (Sum(Cnt) For [Color] in ([Total],' + @SQL + ') ) p'
Exec(@SQL);
返回
Package Barcode Total BLUE PINK RED YELL
12345 3 1 NULL 1 1
19999 5 2 1 2 NULL
编辑 - 如果有帮助,SQL Generates看起来像这样
Select [Package Barcode],[Total],[BLUE],[PINK],[RED],[YELL]
From (
Select [Package Barcode],B.[Color],B.[Cnt]
From YourTable A
Cross Apply (
Select Color=A.Color,Cnt=1
Union All
Select Color='Total',Cnt=1
) B
) A
Pivot (Sum(Cnt) For [Color] in ([Total],[BLUE],[PINK],[RED],[YELL]) ) p
编辑2
Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Color) From YourTable Order by 1 For XML Path('')),1,1,'')
Select @SQL = '
Select [Package Barcode],[Total],' + @SQL + '
From (
Select [Package Barcode],[Color],[Cnt]=case when Sum(Cnt)=0 then ''>>'' else cast(Sum(Cnt) as nvarchar(25)) end
From (
Select [Package Barcode],[Color],[Cnt]=Sum(1) from YourTable Group By [Package Barcode],[Color]
Union ALL
Select Distinct [Package Barcode],C.[Color],[Cnt]=0
From YourTable
Cross Join (Select Distinct Color From YourTable) C
Union All
Select [Package Barcode],[Color]=''Total'',[Cnt]=Sum(1) from YourTable Group By [Package Barcode]
) A
Group By [Package Barcode],[Color]
) A
Pivot (max(Cnt) For [Color] in ([Total],' + @SQL + ') ) p'
Exec(@SQL);
返回
Package Barcode Total BLUE PINK RED YELL
12345 3 1 >> 1 1
19999 5 2 1 2 >>
无法获得→显示,所以我放了一个>>作为一个地方标记。
编辑3 - 条件聚合
Select [Package Barcode]
,[Total] = sum(1)
,[BLUE] = sum(case when color='Blue' then 1 else 0 end)
,[Pink] = sum(case when color='Pink' then 1 else 0 end)
--.. Add more colors
From YourTable
Group By [Package Barcode]