我正在从小提琴示例中创建一个交叉标签视图。基本上,我收到了一个包含Customers
,Vendors
和Product Type
的表格。我想生成一个视图,其中供应商是行,列是按产品类型划分的总销售额。
结构是
CustomerID Vendor ProductType
--------------------------------
1 A Type1
2 A Type2
3 B Type1
4 A Type2
我想要的最终结果是:
Vendor Type1 Type2
---------------------
A 1 2
B 1 0
/* Count the number of sales by Product Type for each Vendor. */
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(ProductType)
from MyTable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Vendor,' + @cols + '
from MyTable
pivot
(
count (ProductType)
for ProductType in (' + @cols + ')
) p
ORDER BY Vendor ASC'
execute(@query)
最终结果是每个供应商有多行,而不是具有聚合计数的单行。
E.g。
Vendor Type1 Type2
---------------------
A 1 0
A 0 1
B 1 0
A 0 1
有没有人对此查询可能遗漏的内容有任何了解?
感谢。
答案 0 :(得分:1)
我建议您使用子查询从表中选择所需的列。问题是您的数据按vendor
和customerId
分组。 customerId
对于每一行都是不同的,将您的查询更改为以下内容将为您提供结果:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(ProductType)
from MyTable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'SELECT Vendor,' + @cols + '
from
(
select vendor, producttype
from MyTable
) d
pivot
(
count (ProductType)
for ProductType in (' + @cols + ')
) p
ORDER BY Vendor ASC'
execute(@query);
见SQL Fiddle with Demo。这给出了一个结果:
| VENDOR | TYPE1 | TYPE2 |
| A | 1 | 2 |
| B | 1 | 0 |