【问题标题】:Convert multiple record to multiple columns in DB2将多条记录转换为 DB2 中的多列
【发布时间】:2023-01-20 07:23:57
【问题描述】:

我有一个如下所示的数据集:

ID  Type    Email
1   A   emily&gmail.com
1   B   adam&gmail.com
1   C   tim&gmail.com
2   A   jim&gmail.com
2   C   kenny&gmail.com
3   A   sam&gmail.com
3   B   asd123&gmail.com
3   C   emma&gmail.com
4   D   jkl&gmail.com
4   F   tester&gmail.com
4   G   form&gmail.com
5   B   another&gmail.com
5   C   idk&gmail.com

我想在 Cloud DB2 实例中使用 SQL 将其转换为这种格式:

ID   A                 B
1    emily&gmail.com   adam&gmail.com
2    jim&gmail.com     NULL
3    sam&gmail.com     asd123&gmail.com
4    NULL              NULL
5    NULL              another&gmail.com

如示例所示,在我的原始表中,我有 3 列,其中类型可以是 A、B、C、D、E、F 或 G。我想创建一个新数据集,我只保留 ID 列,每个 ID这里必须是独一无二的。从前面的类型列中,A 和 B 将是此数据集中的列。 如果 ID 在第一个数据集中的类型为 A,则相应的电子邮件地址将转到 A 列。 B 也一样。如果第一个数据集中没有 A 或 B 记录,则值应为 NULL。

我尝试了以下代码,但可能语法有问题:

SELECT ID
       MAX(CASE WHEN ROLE = 'A' THEN T.EMAIL ELSE NULL END) AS A,
       MAX(CASE WHEN ROLE = 'B' THEN T.EMAIL ELSE NULL END) AS B
  
FROM MYSCHEMA.MYTABLE T 

【问题讨论】:

标签: sql db2


【解决方案1】:

只是在这里得到一个答案,因为答案来自 cmets。我只是错过了 GROUP BY,我可以通过删除 ELSE NULL 部分来缩短查询:

SELECT ID,
       MAX(CASE WHEN ROLE = 'A' THEN T.EMAIL END) AS A,
       MAX(CASE WHEN ROLE = 'B' THEN T.EMAIL ELSE NULL END) AS B
  
FROM MYSCHEMA.MYTABLE T
GROUP BY ID

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多