我有一个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
中包含行的每个商店返回一行,但不为那些没有的行返回行。我想要的是每个商店一行,0
count
如果它没有记录。
如果我无法访问stores
表,我该怎么做?
答案 0 :(得分: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 ..
)对该表进行外连接,而不是“使一个表达”。
这也可以在没有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版本更容易理解)
答案 1 :(得分: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;