問題
- 売れた順序に関係なく、ペアの数を合計した結果を出力したい。
item_a |item_b |pair item_a |item_b |pair
-------+-------+----- -------+-------+-----
12345 | 12345 | 12 → 12345 | 12345 | 12
12345 | 67890 | 9 12345 | 67890 | 14
67890 | 12345 | 5
ちなみに
SELECT S0.item_a, S0.item_b,
SUM (S0.pair_tally + S1.pair_tally) AS pair_tally
FROM SalesSlips AS S0, SalesSlips AS S1
WHERE S0.item_b = S1.item_a
AND S0.item_a = S1.item_b
GROUP BY S0.item_a, S0.item_b, S1.item_a, S1.item_b;
の結果は
item_a |item_b |pair_tally
-------+-------+-----------
12345 | 12345 | 24
12345 | 67890 | 9
Emaさんの答え
Kungさんの答え
SQL文
select s0.item_a , s0.item_b , sum(s0.pair_tally + s1.pair_tally) as pair_tally
from salesslips2 as s0 , salesslips2 as s1
where s0.item_b = s1.item_a
and s0.item_a = s1.item_b
and s0.oid > s1.oid
group by s0.item_a , s0.item_b , s1.item_a , s1.item_b
UNION ALL
select s0.item_a , s0.item_b , s0.pair_tally
from salesslips2 as s0 , salesslips2 as s1
where s0.item_b = s1.item_a
and s0.item_a = s1.item_b
and s0.oid = s1.oid
考え方
①各タプルが行番号を持つようにテーブルの定義に「with oids」を追加する
②oidを使って重複行を排除する
結果
item_a | item_b | pair_tally
--------+--------+------------
67890 | 12345 | 14
12345 | 12345 | 12
(2 rows)
感想
UNION ALLを使っているので魔界テーブルを何度も検索してしまうのでコストが悪いのでは。。
CASEを使った方がいいのでは。。
最終更新:2008年05月29日 11:15