【问题标题】:SQL Transpose sum of field into columnsSQL 将字段总和转换为列
【发布时间】:2014-06-19 23:13:53
【问题描述】:

在所有使用 PIVOT 和 UNPIVOT 的 SQL 转置问题中,我还没有看到将单行转置为列的问题。这是我的查询:

SELECT '' as Status, '' as "Count", sum(Created) as "Created", 
sum(Forwarded) as "Forwarded", sum(Replied) as "Replied"
FROM 
   (
      SELECT 
      CASE WHEN a.TO_WG_ID is null and a.CREATED_DATE_TIME =                          
         (select min(b.created_date_time) from ymtn.message b 
         where b.thread_id = a.thread_id) THEN 1 ELSE 0
       END AS "Created",
       CASE WHEN a.TO_WG_ID is not null and a.FROM_WG_ID is not null THEN 1 ELSE 0
       END AS "Forwarded",
       CASE WHEN a.TO_WG_ID is null and a.CREATED_DATE_TIME != (select 
         min(b.created_date_time) from ymtn.message b where b.thread_id =
         a.thread_id) THEN 1 ELSE 0
       END AS "Replied"
       FROM ymtn.MESSAGE a left join YMTN.WORKGROUP b
       ON a.FROM_WG_ID=b.WORKGROUP_ID where b.WORKGROUP_ID='1STOP_PROCESS' 
) a 

这是我上面查询的输出(有两个静态字段 - 状态和计数 - 如果我能弄清楚是否正确转置,我可能不需要):

Status    Count    Created    Forwarded    Replied
                     1693        209        1499 

这是我想要的输出:

Status    Count
Created   1693
Forwarded  209
Replied   1499

请帮我找到一种方法来做到这一点。谢谢!

【问题讨论】:

    标签: sql sql-server transpose


    【解决方案1】:

    测试数据

    DECLARE @TABLE TABLE
     (  [Status] VARCHAR(10)
        ,[Count] VARCHAR(10)
        ,Created INT
        ,Forwarded INT
        ,Replied INT
      )
    INSERT INTO @TABLE VALUES
    ('', '', 1693 , 209 ,1499)
    

    查询

     ;WITH CTE
     AS
      (
       SELECT * FROM (
          SELECT Created, Forwarded, Replied FROM @TABLE  --<-- Your Existing query here
        ) t
       UNPIVOT (Vals FOR N IN (Created, Forwarded, Replied)) up
      )
    SELECT N AS [Status] 
          ,Vals AS [Count]
     FROM CTE
    

    结果集

    ╔═══════════╦═══════╗
    ║  Status   ║ Count ║
    ╠═══════════╬═══════╣
    ║ Created   ║  1693 ║
    ║ Forwarded ║   209 ║
    ║ Replied   ║  1499 ║
    ╚═══════════╩═══════╝
    

    【讨论】:

      【解决方案2】:

      你可以联合他们。

      Select 'Created' as Status, Sum... as Count
      from...
      union all
      select 'Forwarded', Som...
      union all
      select 'Replied, sum...
      

      【讨论】:

        【解决方案3】:

        是否需要进行复杂的转置?我认为您可以使用工会来满足您的需求。

          SELECT
            "Created" AS Status,
            COUNT(*) AS Count
          FROM ymtn.MESSAGE a
          LEFT JOIN YMTN.WORKGROUP b
            ON a.FROM_WG_ID = b.WORKGROUP_ID
          WHERE b.WORKGROUP_ID = '1STOP_PROCESS'
          AND a.TO_WG_ID IS NULL
          AND a.CREATED_DATE_TIME = (SELECT
            MIN(c.created_date_time)
          FROM ymtn.message c
          WHERE c.thread_id = a.thread_id)
          UNION
          SELECT
            "Forwarded",
            COUNT(*)
          FROM ymtn.MESSAGE a
          LEFT JOIN YMTN.WORKGROUP b
            ON a.FROM_WG_ID = b.WORKGROUP_ID
          WHERE b.WORKGROUP_ID = '1STOP_PROCESS'
          AND a.TO_WG_ID IS NOT NULL
          AND a.FROM_WG_ID IS NOT NULL
          UNION
          SELECT
            "Replied",
            COUNT(*)
          FROM ymtn.MESSAGE a
          LEFT JOIN YMTN.WORKGROUP b
            ON a.FROM_WG_ID = b.WORKGROUP_ID
          WHERE b.WORKGROUP_ID = '1STOP_PROCESS'
          AND a.TO_WG_ID IS NULL
          AND a.CREATED_DATE_TIME != (SELECT
            MIN(c.created_date_time)
          FROM ymtn.message c
          WHERE c.thread_id = a.thread_id)
        

        (注意:未提供示例表和数据,因此未测试执行 SQL)。

        【讨论】:

          猜你喜欢
          • 2021-02-10
          • 1970-01-01
          • 2021-11-24
          • 1970-01-01
          • 1970-01-01
          • 2021-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多