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);
看