【问题标题】:SQL Converting Column into Rows in Single Select StatementSQL在单选语句中将列转换为行
【发布时间】:2014-04-17 18:07:54
【问题描述】:

我需要转换 SQL 输出的解决方案

我在写

    SELECT Merchant_Master.Merchant_ID,
           COUNT(Coupon_Type_ID) AS "Total Coupons",
           Coupon_Type_ID,
           CASE WHEN Coupon_Type_ID=1 
                     THEN COUNT(Coupon_Type_ID)
            END AS "Secret",
           CASE WHEN Coupon_Type_ID=2 
                     THEN count(Coupon_Type_ID)
            END AS "Hot"
      FROM Coupon_Master 
           INNER JOIN Merchant_Master 
               ON Coupon_Master.Merchant_ID=Merchant_Master.Merchant_ID
    GROUP BY 
           Coupon_Master.Coupon_Type_ID,
           Merchant_Master.Merchant_ID

并获得输出为

Merchant_ID Total Coupons Coupon_Type_ID Secret      Hot
----------- ------------- -------------- ----------- -----------
20          6             1              6           NULL
22          4             1              4           NULL
22          2             2              NULL        2
23          1             2              NULL        1
24          2             1              2           NULL
25          3             1              3           NULL
25          2             2              NULL        2

但我想输出为

Merchant_ID     Secret     Hot_Coupons     
-----------     ------    ------------- 
20                6             0
22                4             2
23                0             1
24                2             0
25                3             2

请帮我解决问题。

【问题讨论】:

    标签: sql sql-server sql-server-2008 calculated-columns


    【解决方案1】:

    CASE 表达式移动到聚合中。我也改用SUM 而不是COUNT - 有一个COUNT 变体,但它可能会显示一条警告,提示我要消除我宁愿避免的NULL 值。

    SELECT Merchant_Master.Merchant_ID,
           SUM(CASE WHEN Coupon_Type_ID=1 
                     THEN 1 ELSE 0 END) AS "Secret",
           SUM(CASE WHEN Coupon_Type_ID=2 
                     THEN 1 ELSE 0 END) AS "Hot"
      FROM Coupon_Master 
           INNER JOIN Merchant_Master 
               ON Coupon_Master.Merchant_ID=Merchant_Master.Merchant_ID
    GROUP BY 
           Merchant_Master.Merchant_ID
    

    【讨论】:

    • 另外一项更改是从 GROUP BY 中删除 Coupon_Master.Coupon_Type_ID
    【解决方案2】:

    将其放在子查询中并添加group by Merchant_ID, Total, Coupons, Coupon_Type_ID

    将 Secret 和 hot 聚合为 SUM

    select 
    ...
    SUM(secret) as secret,
    SUM(Hot_Coupons) as Hot_Coupons     
    FROM (your original query) raw
    group by Merchant_ID, Total, Coupons, Coupon_Type_ID
    

    【讨论】:

    • 在我看来,表中没有这样的列(秘密和热)
    • 感谢您的及时回复,但我的表中没有此类名称的列,即 Hot,Secret。
    • 我没有得到输出。
    • 您的查询中有包含名称的列
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2017-08-11
    • 2013-02-15
    • 2019-07-03
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多