【问题标题】:how to get sql to pring in the same row instead multple rows (db is db2)如何让 sql 在同一行而不是多行中打印(db 是 db2)
【发布时间】:2022-01-16 18:55:21
【问题描述】:

我有 2 个表需要从中选择数据。

表 1:

ID name
1 John
2 Mark
3 Anna

表2:

Person_ID type year
1 born 1920
1 graduated 1950
1 died 2000
2 born 1940
2 graduated 1960
2 died 2011

我想编写一个查询,将它们全部放入同一行:

id name born grad died
1 John 1920 1950 2000

我试过了:

SELECT
    t1.id AS id, t1.name AS name, 
    CASE WHEN t2.type = 'born' THEN t2.year END AS born,
    CASE WHEN t2.type = 'graduated' THEN t2.year END AS grad,
    CASE WHEN t2.type = 'died' THEN t2.year END AS died
FROM
    table1 t1 
INNER JOIN 
    table2 t2 ON t1.id = t2.Person_ID
WHERE
    t1.id = 1 
GROUP BY
    t1.id, t1.name, t2.type, t2.year

这是我现在得到的结果:

id name born grad died
1 John 1920 null null
1 John null 1950 null
1 John null null 2000

【问题讨论】:

    标签: sql db2 row


    【解决方案1】:

    使用旋转逻辑:

    SELECT
        t1.ID,
        t1.name,
        MAX(CASE WHEN t2.type = 'born'      THEN t2.year END) AS born,
        MAX(CASE WHEN t2.type = 'graduated' THEN t2.year END) AS grad,
        MAX(CASE WHEN t2.type = 'died'      THEN t2.year END) AS died
    FROM table1 t1
    INNER JOIN table2 t2
        ON t2.Person_ID = t1.ID
    GROUP BY
        t1.ID,
        t1.name
    ORDER BY
        t1.ID;
    

    【讨论】:

    • 在放入 max 之前,它迫使我现在将年份和类型放在“group by”下,当我按照您的建议将 max 删除时,我将其删除,它可以一起工作。你能解释一下吗?
    • @Dexter Well MAX() 是一个聚合函数,所以typeyear 可以出现在MAX 中而不包括在GROUP BY 中。
    猜你喜欢
    • 2011-03-26
    • 2020-10-08
    • 2023-01-27
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多