我怎样才能 SELECT 一组预定义的值及其计数?
How can I SELECT a predefined set of values and their counts?
为了设置问题,假设我想显示我的销售团队中三个人中每个人的总销售额。 Bob 和 Alice 有销售额,但 James 是新推销员,没有销售额。
有一个名为 sales
的 table,其数据如下:
id
卖家
数量
0
爱丽丝
5 美元
1
鲍勃
4美元
2
爱丽丝
16 美元
3
鲍勃
6 美元
我可以像这样使用 SUM:
SELECT seller, SUM(amount)
FROM sales
GROUP BY seller
...生成如下结果集:
卖家
total_sales
爱丽丝
21 美元
鲍勃
10 美元
但是,这不包括新来的没有销量的詹姆斯。我想要的结果集是:
卖家
total_sales
爱丽丝
21 美元
鲍勃
10 美元
詹姆斯
$0
问:如何获得包含 James(零)销售额的所需结果集?
请注意,销售人员列表未存储在任何其他 table 中;我希望我需要将其硬编码到我的查询中,但我不知道如何做。
理想情况下,您应该有专门的 table 卖家,您希望这些卖家出现在您的报告中。没有这个,我们可以使用包含所有卖家名称的内联联合子查询。
SELECT t.seller, COALESCE(SUM(s.amount), 0) AS total_sales
FROM
(
SELECT 'Alice' AS seller UNION ALL
SELECT 'Bob' UNION ALL
SELECT 'James'
) t
LEFT JOIN sales s
ON s.seller = t.seller
GROUP BY
t.seller;
您可以使用 UNION:
WITH people AS(
SELECT 'alice' as person
UNION ALL SELECT 'bob'
UNION ALL SELECT 'james'
)
SELECT * FROM people LEFT JOIN sales ON people.person = sales.seller
现在您可以像使用 table 一样使用 people
。对左连接产生的空值进行分组和求和将导致 james
为零
嗯。 . .如果您需要对销售人员进行硬编码,那么您可能已经认识了新的销售人员。如果是这种情况,您可以使用 union all
:
select seller, sum(sales)
from sales
group by seller
union all
select 'James', 0;
如果你不想列出所有销售人员,但有一个新的超级列表,你也可以使用 full join
:
select seller, coalesce(sum(s.sales), 0)
from sales s full join
(select 'James' as seller union all
select 'Bob' as seller
) news
using (seller);
如果您有一长串 sellers
并且不想列出所有这些,这会很方便。
为了设置问题,假设我想显示我的销售团队中三个人中每个人的总销售额。 Bob 和 Alice 有销售额,但 James 是新推销员,没有销售额。
有一个名为 sales
的 table,其数据如下:
id | 卖家 | 数量 |
---|---|---|
0 | 爱丽丝 | 5 美元 |
1 | 鲍勃 | 4美元 |
2 | 爱丽丝 | 16 美元 |
3 | 鲍勃 | 6 美元 |
我可以像这样使用 SUM:
SELECT seller, SUM(amount)
FROM sales
GROUP BY seller
...生成如下结果集:
卖家 | total_sales |
---|---|
爱丽丝 | 21 美元 |
鲍勃 | 10 美元 |
但是,这不包括新来的没有销量的詹姆斯。我想要的结果集是:
卖家 | total_sales |
---|---|
爱丽丝 | 21 美元 |
鲍勃 | 10 美元 |
詹姆斯 | $0 |
问:如何获得包含 James(零)销售额的所需结果集?
请注意,销售人员列表未存储在任何其他 table 中;我希望我需要将其硬编码到我的查询中,但我不知道如何做。
理想情况下,您应该有专门的 table 卖家,您希望这些卖家出现在您的报告中。没有这个,我们可以使用包含所有卖家名称的内联联合子查询。
SELECT t.seller, COALESCE(SUM(s.amount), 0) AS total_sales
FROM
(
SELECT 'Alice' AS seller UNION ALL
SELECT 'Bob' UNION ALL
SELECT 'James'
) t
LEFT JOIN sales s
ON s.seller = t.seller
GROUP BY
t.seller;
您可以使用 UNION:
WITH people AS(
SELECT 'alice' as person
UNION ALL SELECT 'bob'
UNION ALL SELECT 'james'
)
SELECT * FROM people LEFT JOIN sales ON people.person = sales.seller
现在您可以像使用 table 一样使用 people
。对左连接产生的空值进行分组和求和将导致 james
嗯。 . .如果您需要对销售人员进行硬编码,那么您可能已经认识了新的销售人员。如果是这种情况,您可以使用 union all
:
select seller, sum(sales)
from sales
group by seller
union all
select 'James', 0;
如果你不想列出所有销售人员,但有一个新的超级列表,你也可以使用 full join
:
select seller, coalesce(sum(s.sales), 0)
from sales s full join
(select 'James' as seller union all
select 'Bob' as seller
) news
using (seller);
如果您有一长串 sellers
并且不想列出所有这些,这会很方便。