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 。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 ..) 来“组合”。

这也可以在没有 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 回答