如何选择一组预定义的值及其计数?

为了设置问题,假设我想显示我的销售团队中三个人每人的总销售额。 Bob 和 Alice 有销售,但 James 是新推销员,没有销售。

有一个名为 sales 的表,其中包含如下数据:

id 卖家 金额
0 爱丽丝 $5
1 鲍勃 $4
2 爱丽丝 $16
3 鲍勃 $6

我可以像这样使用 SUM:

SELECT seller,SUM(amount)
FROM sales
GROUP BY seller

...产生如下结果集:

卖家 总销售额
爱丽丝 $21
鲍勃 $10

但是,这不包括新来且没有销售的詹姆斯。我想要的结果集是:

卖家 总销售额
爱丽丝 $21
鲍勃 $10
詹姆斯 $0

问:我怎样才能得到这个包含 James(零)销售额的理想结果集?

请注意,销售人员列表不会存储在任何其他表中;我希望我需要将它硬编码到我的查询中,但我不知道如何。

jieci1981 回答:如何选择一组预定义的值及其计数?

理想情况下,您应该有一个专门的卖家表格,您希望将其显示在您的报告中。没有这个,我们可以使用包含所有卖家名称的内联联合子查询。

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

现在您可以像使用表格一样使用 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 列表并且不想列出所有这些,这会很方便。

本文链接:https://www.f2er.com/6115.html

大家都在问