問題

  • 売れた順序に関係なく、ペアの数を合計した結果を出力したい。
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