【问题标题】:How to combine multiple rows into one in SQL?如何在 SQL 中将多行合并为一行?
【发布时间】:2019-07-14 21:26:03
【问题描述】:

我有一个包含以下列的特定表格 -

属性 ID 可以有 6 个可能的值,从 1 到 6。此表将包含所有客户的条目。客户的每一行都包含 1-6 个值的条目。

现在我想要实现的目标如下 -

我执行以下查询 -

SELECT CUST_ID,
        CASE WHEN "ATTR ID"=1 THEN "ATTR_VALUE" END AS ATTR_ID_1,
        CASE WHEN "ATTR ID"=2 THEN "ATTR_VALUE" END AS ATTR_ID_2,
        CASE WHEN "ATTR ID"=3 THEN "ATTR_VALUE" END AS ATTR_ID_3,
        CASE WHEN "ATTR ID"=4 THEN "ATTR_VALUE" END AS ATTR_ID_4,
        CASE WHEN "ATTR ID"=6 THEN "ATTR_VALUE" END AS ATTR_ID_5,
        CASE WHEN "ATTR ID"=7 THEN "ATTR_VALUE" END AS ATTR_ID_6
        
FROM "TABLE_NAME" where CUST_ID='20002123'

这会很好地产生 6 列,但最终也会创建 3 行 -

我应该旋转表格吗?

谢谢

【问题讨论】:

    标签: mysql sql database postgresql select


    【解决方案1】:

    你很接近:

    SELECT CUST_ID,
        max(CASE WHEN "ATTR ID"=1 THEN "ATTR_VALUE" END) AS ATTR_ID_1,
        max(CASE WHEN "ATTR ID"=2 THEN "ATTR_VALUE" END) AS ATTR_ID_2,
        max(CASE WHEN "ATTR ID"=3 THEN "ATTR_VALUE" END) AS ATTR_ID_3,
        max(CASE WHEN "ATTR ID"=4 THEN "ATTR_VALUE" END) AS ATTR_ID_4,
        max(CASE WHEN "ATTR ID"=6 THEN "ATTR_VALUE" END) AS ATTR_ID_5,
        max(CASE WHEN "ATTR ID"=7 THEN "ATTR_VALUE" END) AS ATTR_ID_6
    
    FROM "TABLE_NAME" where CUST_ID='20002123'
    Group by cust_id;
    

    另外,您可以查看枢轴。

    【讨论】:

    • 感谢工作正常。我不知道我们可以对字符串使用 max() 函数。我以为它只用于数字列。
    【解决方案2】:

    您可以使用GROUP BY CUST_ID 聚合以将多行作为单行。

    尝试如下更改您的查询。

    SELECT CUST_ID, 
           Max(ATTR_ID_1) AS ATTR_ID_1, 
           Max(ATTR_ID_2) AS ATTR_ID_2, 
           Max(ATTR_ID_3) AS ATTR_ID_3, 
           Max(ATTR_ID_4) AS ATTR_ID_4, 
           Max(ATTR_ID_5) AS ATTR_ID_5, 
           Max(ATTR_ID_6) AS ATTR_ID_6 
    FROM   (SELECT CUST_ID, 
                   CASE WHEN "ATTR ID" = 1 THEN "ATTR_VALUE"  END AS ATTR_ID_1, 
                   CASE WHEN "ATTR ID" = 2 THEN "ATTR_VALUE"  END AS ATTR_ID_2, 
                   CASE WHEN "ATTR ID" = 3 THEN "ATTR_VALUE"  END AS ATTR_ID_3, 
                   CASE WHEN "ATTR ID" = 4 THEN "ATTR_VALUE"  END AS ATTR_ID_4, 
                   CASE WHEN "ATTR ID" = 6 THEN "ATTR_VALUE"  END AS ATTR_ID_5, 
                   CASE WHEN "ATTR ID" = 7 THEN "ATTR_VALUE"  END AS ATTR_ID_6 
            FROM   "TABLE_NAME" 
            WHERE  CUST_ID = '20002123')T 
    GROUP  BY CUST_ID 
    

    【讨论】:

    • 这行得通。谢谢你。我不知道 max() 函数也可以用于字符串
    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2011-09-30
    • 2023-02-19
    相关资源
    最近更新 更多