使用 SQL(雪花)旋转表的列

问题描述 投票:0回答:1

我需要连接 3 个表,最终结果是某些列的数据透视表。

情况如下:

表1

身份证 COLUMN_A COLUMN_B COLUMN_C COLUMN_G NN_COLUMN_H NN_COLUMN_I
1 10 1 123aa
1 20 2 56211 废话
1 30 3 123aa vvvv
2 40 4 Bb 678cf
2 50 5 Bb 56211 废话 嗯嗯

表2

身份证 COLUMN_C COLUMN_J NN_COLUMN_K
Aa_G 啊啊
Aa_G Bb 啊啊
Aa_G 抄送 啊啊 1234
Aa_G DD 啊啊 5678

表3

身份证 COLUMN_D COLUMN_E COLUMN_F COLUMN_L NN_COLUMN_M NN_COLUMN_N
1 价值1 10 2024年1月3日 正确 12 0000a
1 价值1 11 2024年2月3日 正确 34 0000b
1 价值2 10 2024年1月3日 正确 56 0000b
2 价值1 15 2024年1月3日 正确 78 0000b
2 价值2 12 2024年1月3日 正确 89 0000s
2 价值2 12 2024年2月3日 正确 45 00001

表4,最终结果

身份证 价值1 价值2 COLUMN_F COLUMN_C COLUMN_G COLUMN_J COLUMN_L
1 10 10 2024年1月3日 Aa_G 啊啊 正确
1 11 2024年2月3日 Aa_G 啊啊 正确
2 15 12 2024年1月3日 Bb Aa_G 啊啊 正确
2 12 2024年2月3日 Bb Aa_G 啊啊 正确

我尝试过以下方法:

SELECT * 
FROM
TABLE3
LEFT JOIN TABLE1
ON TABLE3.ID = TABLE1.ID
LEFT JOIN TABLE2
ON TABLE1.COLUMN_C = TABLE2.COLUMN_C
WHERE TABLE3.COLUMN_D in ('VALUE1', 'VALUE2')

但是,我对在哪里或如何实施 PIVOT 线感到困惑。 应该旋转的列是table3中的column_D和column_E。

sql pivot snowflake-cloud-data-platform left-join
1个回答
0
投票

参见示例

select id
  ,max(case when column_d='VALUE1' then column_e end)value1
  ,max(case when column_d='VALUE2' then column_e end)value2
  ,column_f
from table3
group by id,column_f
order by id,column_f;

每个日期超过 1 个 (Id,VALUEx) 的情况

select id
  ,max(case when column_d='VALUE1' then column_e end)value1
  ,max(case when column_d='VALUE2' then column_e end)value2
  ,column_f,rn
from (
  select *
    ,row_number()over(partition by id,column_f,column_d order by column_f)rn
  from table3
)t
group by id,column_f,rn
order by id,column_f,rn;

加入为

select *
from(
  select id
    ,max(case when column_d='VALUE1' then column_e end)value1
    ,max(case when column_d='VALUE2' then column_e end)value2
    ,column_f
  from table3
  WHERE TABLE3.COLUMN_D in ('VALUE1', 'VALUE2')
  group by id,column_f
)t3
LEFT JOIN TABLE1
ON T3.ID = TABLE1.ID
LEFT JOIN TABLE2
ON TABLE1.COLUMN_C = TABLE2.COLUMN_C
order by t3.id,t3.column_f;

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.