SQL Server - 动态数据透视表

标签 sql sql-server dynamic pivot

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

相关文章:

sql-server - SQL Server : how do I kill a -3 SPID?

sql - 如何在 MSSQL 查询中修剪前导和尾随制表符空格

sql-server - 从 SQL Server 2008 R2 Express 升级到 SQL Server 2008 R2 Enterprise

python - 如何在 python 中定义匿名类型

mysql - 我找不到在 MySQL 上的学校数据库中实现消息的方法

mysql - 更改表小数字段?

c# - 从 DynamicObject 中删除事件

C++ 数组的动态内存分配

javascript - 如何打印 html 表格中仅一个单元格关联的结果集

mysql - 从mysql结果中获取最新记录