对你来说,SQL爱好者的挑战

时间:2014-03-25 12:16:01

标签: sql-server reporting-services

对于工作世界来说,我是一名刚出现的校队。作为培训的一部分,我开始通过SQL报告服务创建一些报告。

这是一个我被困住的挑战。请帮我完成这个查询。这是怎么回事!

  • employee_table中有几个员工,每个员工都有唯一的标识符,称为emp_id
  • 有一个time_sheet表,其中包含几个活动以及每个员工的每个小时,并通过emp_id引用它们。每个活动都有一个TIMESHEET_DATE,对应于提交所有活动的日期(每月一次)。有几个活动的日期相同,因为所有这些活动都是在同一天提交的。
  • 还有一个通过emp_id引用员工的离职表。在休假表中,有一列用于它们起飞的天数和休假的开始日期(Leave_FROM)。

我必须创建一个用户输入月份的参数(简单易用)......

现在,在报告中,第1列必须有他们的名字(简单),第2列必须有指定月份的总小时数(HOURS),第3列必须显示他们在指定月份休假的天数。

这可能很棘手,并非所有人都在留座表中都有一个条目,但每个人都在Time_Sheet表中有活动。

以下是我从查询中得到的内容,但它并没有真正帮助我。

不幸的是,我无法上传图片,所以这里有一个链接

http://imageshack.com/a/img822/8611/5czv.jpg

哦,是的,我的SQL风格是SQL Server

2 个答案:

答案 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