【问题标题】:SQL Server - Dynamic PivotSQL Server - 动态数据透视
【发布时间】:2014-07-26 13:19:31
【问题描述】:

我需要一些帮助。我有两列,地点和名称,我想要每个地点的名称计数。目前数据看起来像:

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

【问题讨论】:

    标签: sql sql-server dynamic pivot


    【解决方案1】:

    您当前的查询已接近,但由于您想要 count 的数量 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

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 2013-02-09
      • 2018-11-22
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多