制定 sql 查询时遇到问题

Posted

技术标签:

【中文标题】制定 sql 查询时遇到问题【英文标题】:trouble formulating an sql query 【发布时间】:2013-11-25 03:04:37 【问题描述】:

我正在尝试制定一个查询,给定两个表:(1)销售人员,(2)销售;显示销售人员带来的 id、名称和销售额总和。问题是我可以获得带入资金的 id 和总和,但我不知道如何添加他们的名字。此外,我的尝试省略了不卖任何东西的销售人员,这是不幸的。

详细说明:

有两个简单的表:

create table Salespersons (
    id integer,
    name varchar(100)
);

create table Sales (
    sale_id integer,
    spsn_id integer,
    cstm_id integer, 
    paid_amt double
);

我想为每个销售员显示一个查询 他们带来的总销售额。

想到这个查询:

select spsn_id, sum(paid_amt) from Sales group by spsn_id

此查询仅返回 id 列表和总金额 在,但不是销售人员的姓名,它省略了 什么都不卖的销售人员。

如何查询 Salespersons 中的每个销售人员 表,打印他们的 ID、姓名、销售额总和,如果他们是 0 什么都没卖。

感谢您的帮助!

提前谢谢!

【问题讨论】:

【参考方案1】:

试试这个:

SELECT sp.id,sp.name,SUM(NVL(s.paid_amt,0))
FROM salespersons sp
LEFT JOIN sales s ON sp.id = s.spsn_id
GROUP BY sp.id, sp.name

LEFT JOIN 将返回销售人员,即使他们没有销售。

只要该用户没有销售,NVL 就会给你 0。

【讨论】:

这正是我想要的!非常感谢!【参考方案2】:

试试下面的

select sp.id, sp.name, sum(s.paid_amt)
  from salespersons sp
  left join sales s
    on sp.id = s.spsn_id
 group by sp.id, sp.name

【讨论】:

已更新,因为我忘记包含 id :P,它应该保留加入,因为销售人员可能没有销售【参考方案3】:

或者试试这个:

with t as
(select spsn_id, sum(paid_amt) as totamt
  from Sales 
  group by spsn_id 
)
select sp.id, sp.name, coalesce( t.totamt, 0 )
  from salespersons sp
  left join t  ON sp.id = t.spsn_id

哪个(理论上)在加入之前进行分组,从而节省时间。

Coalesce 在这里与 NVL 做同样的事情,但更便携。

【讨论】:

以上是关于制定 sql 查询时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

sql加列前缀查询时遇到一个问题

构建 MSAccess SQL 查询时遇到问题

从 VB.NET 复选框选项构建 SQL 查询时遇到问题

遇到产品时增加行号 - T SQL - 单个查询(不允许多个语句)

在 where 子句中使用 Oracle SQL 变量时遇到问题

在 Dbeaver 中遇到 SQL 错误 40001