gpt4 book ai didi

SQL Server - 动态数据透视表

转载 作者:行者123 更新时间:2023-12-04 14:01:40 24 4
gpt4 key购买 nike

我需要一些帮助。我有两列,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 Fiddle with Demo

关于SQL Server - 动态数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com