【问题标题】:Write non-Pivot version of a query编写查询的非 Pivot 版本
【发布时间】:2014-02-02 23:30:58
【问题描述】:

这是我的表结构和一些数据:

CREATE TABLE Travel 
(
  ID int primary key, 
  Name nvarchar(25),
  City nvarchar(25),
  Month varchar(3)
)

INSERT INTO Travel
(ID, Name, City, Month)
VALUES
(1, 'Name1', 'Paris','Jan'),
(2, 'Name1', 'Rome','Feb'),
(3, 'Name2', 'Italy','Jan'),
(4, 'Name2', 'Rome','Feb'), 
(5, 'Name3', 'Los Angeles','Jan'),
(6, 'Name3', 'New York','Feb');

谁能帮我写出非 Pivot 版本以仅在有数据时返回“月”列(假设数据库在 SQL Server 2005 之前)。

这是一个示例查询,但它返回 NULL 数据列(4 月、5 月)

SELECT Name,
  max(CASE WHEN MONTH  = 'Jan' THEN City END) Jan,
  max(CASE WHEN MONTH = 'Feb' THEN City END) Feb,
  max(CASE WHEN MONTH = 'Mar' THEN City END) Mar,
  max(CASE WHEN MONTH = 'Apr' THEN City END) Apr,
  max(CASE WHEN MONTH = 'May' THEN City END) May
FROM Travel
GROUP BY Name

NAME    JAN    FEB       MAR     APR      MAY
Name1  Paris       Rome     (null)  (null)  (null)
Name2  Italy       Rome     (null)  (null)  (null)
Name3  Los Angeles New York (null)  (null)  (null)

另外,查询的 PIVOT 版本是什么,因为没有聚合列的函数?

【问题讨论】:

    标签: sql-server-2005 pivot pivot-table


    【解决方案1】:

    您可以轻松地执行以下操作:

    DECLARE
        @v_sql varchar(8000)
    BEGIN
    Set @v_sql = 'SELECT name '
    If exists (select month FROM travel WHERE month='Jan')
    BEGIN
      Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Jan'' THEN City END) Jan'
    End
    
    If exists (select month FROM travel WHERE month='Feb')
    BEGIN
      Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Feb'' THEN City END) Feb'
    End
    
    If exists (select month FROM travel WHERE month='Mar')
    BEGIN
      Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Mar'' THEN City END) Mar'
    End
    
    If exists (select month FROM travel WHERE month='Apr')
    BEGIN
      Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''Apr'' THEN City END) Apr'
    End
    
    If exists (select month FROM travel WHERE month='May')
    BEGIN
      Set @v_sql = @v_sql + ',   max(CASE WHEN MONTH  = ''May'' THEN City END) May'
    End
    
    Set @v_sql = @v_sql + ' FROM Travel GROUP BY name'
    
    EXECUTE(@v_sql)
    
    END
    

    输出:

    NAME     JAN           FEB
    -------- ------------- -----------
    Name1    Paris         Rome
    Name2    Italy         Rome
    Name3    Los Angeles   New York
    

    别忘了查看Fiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 2019-03-07
      • 2016-01-29
      • 2014-11-11
      • 1970-01-01
      相关资源
      最近更新 更多