4

次のようなSQLクエリがあります。

SELECT store_id, SUM(quantity_sold) AS count
FROM sales_table
WHERE store_id IN ('Store1', 'Store2', 'Store3')
GROUP BY store_id;

これにより、に行がある各ストアの行が返されますが、行sales_tableがないストアの行は返されません。私が欲しいのは、レコードがない場合は0forを使用して、ストアごとに1行です。count

storesテーブルにアクセスできないと仮定して、これを行うにはどうすればよいですか?

4

2 に答える 2

7
with stores (store_id) as (
   values ('Store1'), ('Store2'), ('Store3')
)
select st.store_id, 
       sum(sal.quantity_sold) as cnt
from stores st
  left join sales_table sal on sal.store_id = st.store_id
group by st.store_id;

テーブルがある場合はstores、一般的なテーブル式(with ..)を使用して「1つを作成」するのではなく、単にそのテーブルに外部結合を実行します。

これは、CTE(共通テーブル式)なしでも記述できます。

select st.store_id, 
       sum(sal.quantity_sold) as cnt
from (
  values ('Store1'), ('Store2'), ('Store3')
) st
  left join sales_table sal on sal.store_id = st.store_id
group by st.store_id;

(しかし、CTEバージョンの方が理解しやすいと思います)

于 2012-11-02T20:48:17.427 に答える
0

unnest()配列要素から行を生成するために使用できます。

SELECT store, sum(sales_table.quantity_sold) AS count
FROM unnest(ARRAY['Store1', 'Store2', 'Store3']) AS store
LEFT JOIN sales_table ON (sales_table.store_id = store)
GROUP BY store;
于 2012-11-02T21:02:32.693 に答える