我需要一些帮助。我有两列,Place 和 Name,我想要每个地方的 Name 计数。目前数据看起来像:
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);
最佳答案
您当前的查询已关闭,但由于您想要计算
names
的数量,您可以将其用作聚合函数,而不是使用 CASE
子查询中的语句,然后取平均值。
我的建议始终是先将查询编写为静态版本,然后再尝试编写动态 SQL 服务器,主要是为了确保语法正确:
select place, Bad, New, OK
from
(
select place, name
from info_table
) d
pivot
(
count(name)
for name in (Bad, New, OK)
) p;
参见 SQL Fiddle with Demo .一旦逻辑正确,就可以轻松地将其转换为动态 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);
关于SQL Server - 动态数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062032/