次のような製品販売のテーブルがあります。
product | amount | ptype | pdate
p1 | 1.00 | sale | 01/01
p1 | 2.00 | base | 01/02
p2 | 1.50 | sale | 02/03
p3 | 5.25 | base | 10/10
そして、行ごとに1つの製品、金額の合計を表示するテーブルを作成したいと思います。製品が一意の場合はタイプを表示し、そうでない場合はタイプを「VAR」として表示し、製品が一意の場合は日付を表示し、そうでない場合は日付を表示しますヌルとして。結果は次のようになります。
product | total | ptype | pdate
p1 | 3.00 | VAR | (NULL)
p2 | 1.50 | sale | 02/03
p3 | 5.25 | base | 10/10
次のことを行うことで、必要な結果を達成しています。
SELECT DISTINCT product
,(SELECT SUM(amount) FROM T as b GROUP BY b.product HAVING a.product = b.product ) as total
,(SELECT CASE WHEN COUNT(*) = 1 THEN a.ptype ELSE 'VAR' END from T as b GROUP BY b.product HAVING a.product = b.product) as ptype
,(SELECT CASE WHEN COUNT(*) = 1 THEN a.pdate ELSE NULL END from T as b GROUP BY b.product HAVING a.product = b.product) as pdate
FROM T as a
しかし、同じ結果を達成するより効率的な方法があるかどうかを知りたいです。