我需要连接 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。
参见示例
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;