如何将行数据透视到特定列 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的主要内容,如果未能解决你的问题,请参考以下文章