SQL Server中字符串的数据透视表

时间:2014-08-22 10:59:00

标签: sql-server pivot

我有下表,其中包含如下所示的一些细节:

示例

创建表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

1 个答案:

答案 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;

请参阅SQL Fiddle with Demo

现在,如果您有一个未知值,您需要成为最后一列,那么您将创建一个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;

请参阅SQL Fiddle with Demo