2

これら2つの選択があります。違いは、結合テーブルと合計内のケースにあります

select
table1.col1
sum(case when table1.col2 = 'C1' then table1.value else 0 end) as C1
from table1
join table2 on table1.col3 = table2.col3
group by table1.col1

select
table1.col1
sum(case when table1.col2 = 'C2' then table1.value else 0 end) as C2
from table1
join table3 on table1.col3 = table3.col3
group by table1.col1

これらのクエリを単一の選択にマージするにはどうすればよいですか? 問題は、'C2' と同じように、'C1' のすべての行が table2 と結合されている場合にのみ必要です。これは結合の例です。両方の結合の col3 は (列のタイプに関して) 同等ですが、値は同等ではないことがわかります。

select table1.col1, table1.col2, table2.col3 from table1 join table2 on table1.col3 = table2.col3

table1.col1 |   table1.col2 |   table2.col3
'COD1'              'C1'        543
'COD1'              'C2'        329
'COD2'              'C2'        123
'COD1'              'C1'        943

select table1.col1, table1.col2, table3.col3 from table1 join table3 on table1.col3 = table3.col3

table1.col1 |   table1.col2 |   table3.col3
'COD2'              'C2'        632
'COD1'              'C1'        895
'COD1'              'C2'        248
'COD2'              'C1'        458
4

3 に答える 3

2

すべての C1 と C2 を単一の列に入れたい場合は、UNION または UNION ALL を選択できます (重複も含まれます)。

select
table1.col1
sum(case when table1.col2 = 'C1' then table1.value else 0 end) as C1
from table1
join table2 on table1.col3 = table2.col3
union
select
table1.col1
sum(case when table1.col2 = 'C2' then table1.value else 0 end) as C2
from table1
join table3 on table1.col3 = table3.col3

また、C1 と C2 を別々の列に配置する場合は、最初のクエリで列 C2 の case ステートメントを簡単に追加できます。

select
table1.col1
sum(case when table1.col2 = 'C1' then table1.value else 0 end) as C1,
sum(case when table1.col2 = 'C2' then table1.value else 0 end) as C2
from table1
join table2 on table1.col3 = table2.col3
join table3 on table1.col3 = table3.col3
于 2013-09-16T15:14:50.023 に答える
0

クエリに明白な句が必要であると仮定すると、次のgroup byことができます。

select t1.col1,
       sum(case when t1.col3 in (select col3 from table2) and
                     t1.col2 = 'C1'
                then t1.value else 0
           end) as C1,
       sum(case when t1.col3 in (select col3 from table3) and
                     t1.col2 = 'C2'
                then t1.value else 0
           end) as C2
from table1 t1
group by t1.col1;

明示的な結合を行わないように注意してください。andに複数の一致する行があるtable2table3、合計が失われます。

于 2013-09-16T16:28:46.853 に答える