制定 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 查询时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
遇到产品时增加行号 - T SQL - 单个查询(不允许多个语句)