如何将行数据透视到特定列 db2

Posted

技术标签:

【中文标题】如何将行数据透视到特定列 db2【英文标题】:How to pivot row data into specific columns db2 【发布时间】:2020-09-18 16:20:58 【问题描述】:

我想将表格中的结果转换为新结构。这样它就可以将所有的孩子映射到父产品。

当前结果

Parent_Prod_Num|Child_Prod_Num|Child_Prod_Code|Child_Prod_Name
1|11|a123|a
1|12|b123|ab
1|13|c123|abc

预期结果

Parent_Prod_Num|Child_Prod_Num_1| Child_Prod_Code_1|Child_Prod_Name_1| Child_Prod_Num_2| Child_Prod_Code_2|Child_Prod_Name_2| Child_Prod_Num_3| Child_Prod_Code_3|Child_Prod_Name_3
1|11|a123|a|12|b123|ab|13|c123|abc

【问题讨论】:

最多三个孩子吗? 是的,一个父 num 最多可以有 3 个孩子 【参考方案1】:

对于每个父级的固定最大子级数,您可以使用row_number() 枚举行,然后使用条件聚合进行透视:

select parent_prod_num,
    max(case when rn = 1 then child_prod_num  end) as child_prod_num_1,
    max(case when rn = 1 then child_prod_code end) as child_prod_code_1,
    max(case when rn = 1 then child_prod_name end) as child_prod_name_1,
    max(case when rn = 2 then child_prod_num  end) as child_prod_num_2,
    max(case when rn = 2 then child_prod_code end) as child_prod_code_2,
    max(case when rn = 2 then child_prod_name end) as child_prod_name_2,
    max(case when rn = 3 then child_prod_num  end) as child_prod_num_3,
    max(case when rn = 3 then child_prod_code end) as child_prod_code_3,
    max(case when rn = 3 then child_prod_name end) as child_prod_name_3
from (
    select t.*, row_number() over(partition by parent_prod_num order by child_prod_num) rn
    from mytable t
) t
group by parent_prod_num

【讨论】:

只有一个小注释:您可以使用 DECODE 来代替 CASE 来简化语法,例如。 g.: MAX(DECODE(rn, 1, child_prod_num)) AS child_prod_num1 @PavolAdam:确实。我更喜欢case,因为它是标准 SQL 并且(几乎)所有数据库都支持它。

以上是关于如何将行数据透视到特定列 db2的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL/DB2 中使用数据透视?

如何在不使用数据透视的情况下将行转换或转置为 SQL 中的列?

这是一个员工数据,我想使用数据透视将行数据转换为列

在 Tableau 中反透视数据 将行转换为列

将行反透视成列

将行转置为 BigQuery 中的列(数据透视实现)[重复]