問題
fooの数量、barの数量を計算書番号ごとに出す
accounts foo bar 答え
acct_nbr acct_nbr | bar_qty acct_nbr | bar_qty |foo_qty|bar_qty
----------- --------+-------- ---------+--------- --------------------
1 2 | 160 2 | 160 → 1| 10 | 0
2 3 | 320 3 | 320 2| 60 | 160
3 3 | 640 3 | 640 3| 80 | 961
4 3 | 1 3 | 1 4| 0 | 0
サンプルコード↓これ以外を考えよう♪
select a.acct_nbr,
coalesce(f.foo_qty,0) as foo_qty_tot,
coalesce(b.bar_qty,0) as bar_qty_tot
from accounts as a
left outer join
(select acct_nbr,sum(foo_qty) as foo_qty
from foo
group by acct_nbr) as f
on f.acct_nbr = a.acct_nbr
left outer join
(select acct_nbr,sum(bar_qty) as bar_qty
from bar
group by acct_nbr) as b
on f.acct_nbr = b.acct_nbr;
- COALESCE(式1,式2,式3,...)
- 式1がNULL以外→終了、式1がNULL→式2実行。
- 式2がNULL→式3実行、引数で指定された式がNULL以外の値を返すまで続く
- 全ての式がNULL→NULLをCOALESCEの結果として返す
yukaさんの回答
fumikoの回答
考え
- accountsのacct_nbrごとに
- fooからacct_nbrが同じときだけfoo_qtyを足していく
- barからacct_nbrが同じときだけbar_qtyを足していく
SQL
select ac.acct_nbr,
sum(distinct case when ac.acct_nbr = foo.acct_nbr then foo_qty else 0 end),
sum(distinct case when ac.acct_nbr = bar.acct_nbr then bar_qty else 0 end)
from accounts as ac,foo,bar
group by ac.acct_nbr
結果
acct_nbr | sum | sum
----------+-----+-----
1 | 10 | 0
2 | 60 | 160
3 | 80 | 961
4 | 0 | 0
最終更新:2008年06月10日 14:09