对于工作世界来说,我是一名刚出现的校队。作为培训的一部分,我开始通过SQL报告服务创建一些报告。
这是一个我被困住的挑战。请帮我完成这个查询。这是怎么回事!
我必须创建一个用户输入月份的参数(简单易用)......
现在,在报告中,第1列必须有他们的名字(简单),第2列必须有指定月份的总小时数(HOURS),第3列必须显示他们在指定月份休假的天数。
这可能很棘手,并非所有人都在留座表中都有一个条目,但每个人都在Time_Sheet表中有活动。
以下是我从查询中得到的内容,但它并没有真正帮助我。
不幸的是,我无法上传图片,所以这里有一个链接
http://imageshack.com/a/img822/8611/5czv.jpg
哦,是的,我的SQL风格是SQL Server
答案 0 :(得分:1)
Left join
休假表,如果没有人请假,你将无法获得任何结果。
答案 1 :(得分:1)
你需要在这里攻击一些不同的东西。
首先是从employee_table
获取信息,而不管其他两个表中的内容是什么。为此,我会在两个表格上left join
。
你的第二场战斗是,既然你的time_sheet
表中有多行,你将获得每条time_sheet
记录的记录。那不是你想要的。您可以使用SUM聚合和GROUP BY
子句来解决此问题。
接下来是当离开表中没有任何内容并且它返回NULL时您将要遇到的问题。如果在离开表字段周围添加ISNULL(value,0)
,则当该表(该员工)上没有记录时,它将返回0.
以下是您的查询应该是什么样的(不完全确定表/列命名):
我将查询更改为使用临时表,因此总计将单独存储。由于临时表对于没有时间/休假的员工而言为0,因此您可以在最终查询中进行内部联接。检查this以获取有关临时表的更多信息。
SELECT e.emp_id, ISNULL(SUM(ts.Hours),0)[Time]
INTO #TotalTime
FROM employee e
LEFT JOIN time_sheet ts ON e.emp_id = ts.emp_id
GROUP BY e.emp_id
SELECT e.emp_id, ISNULL(SUM(l.days),0) [LeaveTime]
INTO #TotalLeave
FROM employee e
LEFT JOIN leaveTable l ON e.emp_id=l.emp_id
GROUP BY e.emp_id
SELECT e.Emp_Id,Time,LeaveTime FROM Employee e
INNER JOIN #TotalTime t ON e.Emp_Id=t.Emp_Id
INNER JOIN #TotalLeave l ON e.Emp_Id=l.Emp_Id
DROP TABLE #TotalLeave,#TotalTime
以下是SQL Fiddle