怎样才能实现,GROUP BY OR ?

zitjubiz 2003-03-19 06:11:04
我有一个人员表emp(empid,name)
一个项目表pro(pjid,name,season)
一个费用表fee(pjid,empid,fee1,fee2)

我要把每个人员的属于同一季度的项目的费用的合计找出来。
select emp.name,sum(fee1),sum(fee2) from
from emp left join fee on emp.empid=fee.empid
join pro on fee.pjid=pro.pjid and pj.season=1
group by fee.empid ,emp.name

但是我想把没有费用的人员也显示出来,显示费用为0
这个SQL我就不会写了。请指教....


...全文
135 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
8LY8Apollo 2003-03-23
  • 打赏
  • 举报
回复
up
huhongming 2003-03-23
  • 打赏
  • 举报
回复
SELECT emp.[name],ISNULL(fee1,0) AS TotalFee1,ISNULL(fee2,0) AS TotalFee2
FROM emp LEFT JOIN
(SELECT fee.empid,sum(fee1) as fee1,sum(fee2) as fee2
FROM fee join pro on fee.pjid=pro.pjid and pro.season=1
GROUP BY fee.empid) aa
ON emp.empid=aa.empid

union的解法相比于上述解法,主要消耗在于多做了
select name,0,0 from emp
where empid not in(select empid from fee)
相当于又把emp和fee join了一次,执行计划表明多做了一次Hash Match/Left Ansi Semi Join.
用上述解法还有一个额外的好处就是结果是按照Empid排序的
mymmsc 2003-03-23
  • 打赏
  • 举报
回复
select emp.name,isnull(sum(fee1),0),isnull(sum(fee2),0) from emp left join fee on emp.empid=fee.empid left join pro on fee.pjid=pro.pjid and pj.season=1 group by fee.empid ,emp.name
zyf23 2003-03-22
  • 打赏
  • 举报
回复
ting
ComputerSoul 2003-03-21
  • 打赏
  • 举报
回复
同意以上两种解法,不知楼主或其他好手可以这样做呢:比较两种不同解法在数据量大的情况下有何区别,当然是执行效率方面啦。
或许从语法的分析也可看出哪个语句的执行效率高,不过鄙人自问根底不够扎实,还是让高手们来分析吧!
jinzhouk 2003-03-21
  • 打赏
  • 举报
回复
我也碰到类似的问题,总是用第二种方法来解决的。
但看到这个贴子后,觉得如果只有一种分组,用第一种方法很简便。
lizongqi 2003-03-21
  • 打赏
  • 举报
回复
up
ComputerSoul 2003-03-21
  • 打赏
  • 举报
回复
楼上 bluemeteor 的解法还是会漏部分没有“一季度项目的费用”的员工的,
我以前碰到过类似情况,发现还是需要多一个连接才能达到目的。不过当时未能想第一种解法,所以就未能比较两者的效率来;现在又没有相应的数据来测试,因此请楼主能够测试一下,并告知我们等人。

再啰嗦几句。对比两个语句,发现除了两次查询员工表和一个连接是相同之外,两者的不同点在于第一个用了 UNION 加 WHERE ,第二个是用了再次连接。我以为 UNION 语句的速度会较连接的方式慢,所以,第二个解法的执行效率会较快一些。当然,这是想当然的推测,没有经过测试,望高手们能多多指正。

bluemeteor 2003-03-21
  • 打赏
  • 举报
回复
select emp.name,isnull(sum(fee1),0),isnull(sum(fee2),0) from emp left join fee on emp.empid=fee.empid left join pro on fee.pjid=pro.pjid and pj.season=1 group by fee.empid ,emp.name
zitjubiz 2003-03-20
  • 打赏
  • 举报
回复
inner join pro 会把fee没有存在的empid 去掉
left join pro 会把pro不是第一季度的也加上去。
还是XLYT(雨田) Rewiah(乘长风) 的比较好,稍为改一下:
______________________________________________
select emp.name,sum(fee1),sum(fee2) from
from emp left join fee on emp.empid=fee.empid
join pro on fee.pjid=pro.pjid and pj.season=1
group by fee.empid ,emp.name
union all
select name,0,0 from emp
where empid not in(select empid from fee)
_________________________________________________
select emp.name,isnull(fee1,0) as fee1,isnull(fee2,0) as fee2
from emp left join (select empid,sum(fee1) as fee1,sum(fee2) as fee2 from fee inner join pro on fee.pjid=pro.pjid and pj.season=1 group by empid
) as fee1
on emp.empid=fee1.empid

happydreamer 2003-03-19
  • 打赏
  • 举报
回复
select emp.name,isnull(sum(fee1),0),isnull(sum(fee2),0)
from emp left join fee on emp.empid=fee.empid
left join pro on fee.pjid=pro.pjid and pj.season=1
group by fee.empid ,emp.name
sksk 2003-03-19
  • 打赏
  • 举报
回复
select emp.name,sum(isnull(fee1),0),sum(isnull(fee2),0) from emp left join fee on emp.empid=fee.empid inner join pro on fee.pjid=pro.pjid and pro.season=1
group by fee.empid
sksk 2003-03-19
  • 打赏
  • 举报
回复
select emp.name,sum(isnull(fee1),0),sum(isnull(fee2)) from emp left join fee on emp.empid=fee.empid inner join pro on fee.pjid=pro.pjid and pj.season=1
group by fee.empid ,emp.name
pengdali 2003-03-19
  • 打赏
  • 举报
回复
select emp.name,isnull(sum(fee1),0),isnull(sum(fee2),0) from emp left join fee on emp.empid=fee.empid left join pro on fee.pjid=pro.pjid and pj.season=1 group by fee.empid ,emp.name
yoki 2003-03-19
  • 打赏
  • 举报
回复
select emp.name,isnull(sum(fee1),0),isnull(sum(fee2),0)
from emp left join fee on emp.empid=fee.empid
left join pro on fee.pjid=pro.pjid and pj.season=1
group by fee.empid ,emp.name
Rewiah 2003-03-19
  • 打赏
  • 举报
回复
select emp.name,isnull(fee1,0) as fee1,isnull(fee2,0) as fee2
from emp left join (select empid,sum(fee1) as fee1,sum(fee2) as fee2 from fee inner join pro on fee.pjid=pro.pjid and pj.season=1
) as fee1
on emp.empid=fee1.empid
leimin 2003-03-19
  • 打赏
  • 举报
回复
try:
select emp.name,sum(fee1),sum(fee2)
from emp left join fee on emp.empid=fee.empid
inner join pro on fee.pjid=pro.pjid and pj.season=1
group by all fee.empid ,emp.[name]
XLYT 2003-03-19
  • 打赏
  • 举报
回复
select emp.name,sum(fee1),sum(fee2) from
from emp left join fee on emp.empid=fee.empid
join pro on fee.pjid=pro.pjid and pj.season=1
group by fee.empid ,emp.name
union all
select name,0,0 from emp
where empid not exists(select empid from fee)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧