【问题标题】:Transpose T-SQL query转置 T-SQL 查询
【发布时间】:2014-02-25 10:34:40
【问题描述】:

我有一个这样的查询:

SELECT 

SUM(
     CASE 
   WHEN 
START_DATE <= '2014-01-01' AND 
(END_DATE > '2014-01-01' OR END_DATE IS NULL)THEN 1 ELSE 0 END ) AS '201401',

SUM(
     CASE 
   WHEN 
START_DATE <= '2014-02-01' AND 
(END_DATE > '2014-02-01' OR END_DATE IS NULL)THEN 1 ELSE 0 END ) AS '201402')

    (etc)

FROM table

给我这个作为输出:

201401  201402   (etc)
485     498

我需要将其转置,例如给我这个输出:

201401  485
201402  498
(etc)

我发现的示例都是对数据进行分组;我只需要交换行和列。

【问题讨论】:

    标签: sql-server tsql transpose


    【解决方案1】:

    你可以使用联合转置:

    SELECT 
    '201401',
    SUM(
         CASE 
       WHEN 
    START_DATE <= '2014-01-01' AND 
    (END_DATE > '2014-01-01' OR END_DATE IS NULL)THEN 1 ELSE 0 END )
    FROM table
    
    UNION ALL
    
    SELECT 
    '201402',
    SUM(
         CASE 
       WHEN 
    START_DATE <= '2014-02-01' AND 
    (END_DATE > '2014-02-01' OR END_DATE IS NULL)THEN 1 ELSE 0 END )
    FROM table
    
    UNION ALL
    
    SELECT 
        (etc)
    FROM table
    

    【讨论】:

    • 看起来并不优雅,但可以完成工作。我自己也能想到的:)
    【解决方案2】:

    您可以通过使用PIVOT 来做到这一点,但您的列号必须是有限的并且给出如下:

    PIVOT
        (
            SUM (Indicator) FOR Day IN (  [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
                        [11],[12],[13],[14],[15],[16],[17],[18],[19],[20],
                        [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
        ) AS pvt
    

    【讨论】:

      【解决方案3】:

      您最好在客户端执行此操作。不在数据库中。

      SELECT fields, x FROM (
          -- {{ your query here
          select 485 as [201401], 498 as [201402]
          -- }} your query here
      ) AS t
      UNPIVOT (
          x FOR fields in ([201401], [201402])
      ) AS unpvt
      

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多