SQL Server-动态透视

SQL Server-动态透视,sql,sql-server,dynamic,pivot,Sql,Sql Server,Dynamic,Pivot,我需要一些帮助。我有两列,地点和名字,我想为每个地方的名字计数。目前,数据如下所示: Place | Name 100 OK 100 NEW 100 BAD 200 BAD 200 BAD 300 OK 400 OK 400 OK 400 OK 我试图让它看起来像,但是我将围绕20行旋转(这就是为什么我希望命名是动态的) PLACE | OK | NEW | BAD 100 1 1 1 200

我需要一些帮助。我有两列,地点和名字,我想为每个地方的名字计数。目前,数据如下所示:

Place | Name
100     OK
100     NEW
100     BAD  
200     BAD
200     BAD
300     OK
400     OK
400     OK
400     OK
我试图让它看起来像,但是我将围绕20行旋转(这就是为什么我希望命名是动态的)

PLACE | OK | NEW | BAD
100     1     1     1
200     0     0     2
300     1     0     0
400     3     0     0
从一大堆其他的问题来看,这是我想出来的,但是,它不起作用。任何帮助都将不胜感激

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT distinct 
                        ',' +
                        QUOTENAME(NAMES)
                 FROM INFO_TABLE with (nolock)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

SET @query = ' SELECT PLACE ,  ' + @cols + ' 

FROM 
(SELECT 
   CASE 
       WHEN NAME IS NOT NULL
       THEN Count(NAME) 
       ELSE 0 END AS EXPR1, 
       PLACE
       FROM INFO_TABLE with (nolock)) t
PIVOT
( 
AVG(Expr1)
FOR NAME IN (' + @cols + ' )
) 
p ' ;

Execute(@query);

当前查询已结束,但由于您希望对
名称的数量进行
计数,因此可以将其用作聚合函数,而不是在子查询中使用
CASE
语句,然后求平均值

我的建议是,在尝试编写动态SQL server之前,首先将查询编写为静态版本,主要是为了获得正确的语法:

select place, Bad, New, OK
from
(
  select place, name
  from info_table
) d
pivot
(
  count(name)
  for name in (Bad, New, OK)
) p;
请参阅。一旦逻辑正确,就可以轻松地将其转换为动态SQL:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT distinct 
                        ',' +
                        QUOTENAME(NAME)
                 FROM INFO_TABLE with (nolock)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

SET @query = ' SELECT PLACE ,  ' + @cols + ' 

FROM 
(
   SELECT NAME, PLACE
   FROM INFO_TABLE with (nolock)
) t
PIVOT
( 
  count(name)
  FOR NAME IN (' + @cols + ' )
) 
p ' ;

Execute(@query);