我有下表,其中包含如下所示的一些细节:
示例:
创建表product
:
create table product
(
slno int,
item nvarchar(20)
);
插入一些记录:
insert into product values(1,'HDD');
insert into product values(2,'PenDrive');
insert into product values(3,'RAM');
insert into product values(4,'DVD');
insert into product values(5,'RAM');
insert into product values(6,'HDD');
表产品包含:
select * from product;
slno item
----------
1 HDD
2 PenDrive
3 RAM
4 DVD
5 RAM
6 HDD
现在我想创建一个项目字符串,我已经编写了以下脚本:
select distinct
(
select distinct item+','
from product
FOR XML PATH('')
) temp
from product;
结果是:
temp
----------------------
DVD,HDD,PenDrive,RAM,
注意:现在我想以下列格式显示结果:(我需要在pivot table
中使用上述查询,并且需要显示已售出的产品数量出)。
DVD HDD PenDrive RAM
-----------------------
1 2 1 2
我的尝试:
select DVD,HDD,PenDrive,RAM
from
(
select distinct
(
select distinct item+','
from product
FOR XML PATH('')
) temp
from product
) as a
pivot
(
count(temp)
for temp in(DVD,HDD,PenDrive,RAM)
) pt
但得到结果:
DVD HDD PenDrive RAM
------------------------
0 0 0 0
答案 0 :(得分:1)
除非需要动态SQL版本才能获得最终结果,否则无需使用FOR XML PATH
创建列的字符串。
使用PIVOT,您可以轻松地对查询的值进行硬编码:
select DVD, HDD, PenDrive, RAM
from
(
select item
from product
) d
pivot
(
count(item)
for item in (DVD, HDD, PenDrive, RAM)
) piv;
现在,如果您有一个未知值,您需要成为最后一列,那么您将创建一个items
列表并通过动态SQL执行SQL字符串,类似于:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(item)
from product
group by item
order by item
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
select item
from product
) x
pivot
(
count(item)
for item in (' + @cols + ')
) p '
exec sp_executesql @query;