far*_*ave 13 sql-server-2008 join sql-server reporting group-by
我正在尝试为员工时间记录完成一些报告。
我们有两个专门针对这个问题的表格。员工列在Members
表中,他们每天输入他们已完成工作的时间条目并存储在Time_Entry
表中。
使用 SQL Fiddle 的示例设置:http ://sqlfiddle.com/#!3/e3806/7
最终的结果我要的是一个表,表示所有的Members
列中的列表,然后将展示他们的总和小时,在其他列查询的日期。
问题似乎是,如果Time_Entry
表中没有特定成员的行,那么该成员现在有行。我尝试了几种不同的连接类型(左、右、内、外、全外等),但似乎都没有给我想要的,这将是(基于 SQL Fiddle 中的最后一个示例):
/*** Desired End Result ***/
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
ADavis | 0 | 11-10-2013 | 0 | 0
BTronton | 0 | 11-10-2013 | 0 | 0
CJones | 0 | 11-10-2013 | 0 | 0
DSmith | 0 | 11-10-2013 | 0 | 0
EGirsch | 1 | 11-10-2013 | 0.92 | 1
FRowden | 0 | 11-10-2013 | 0 | 0
Run Code Online (Sandbox Code Playgroud)
当我查询 11-1 的特定日期时,我目前得到的是:
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
EGirsch | 1 | 11-10-2013 | 0.92 | 1
Run Code Online (Sandbox Code Playgroud)
根据 EGirsch 日期为 11-10-2013 的一个 Time Entry 行,这是正确的,但我需要查看其他成员的零以获取报告并最终获得此信息的 Web 仪表板/报告。
这是我的第一个问题,虽然我搜索了 Join 查询等。老实说,我不确定这个函数可能被调用,所以我希望这不是重复的,并且会帮助其他人也试图找到解决方案类似的问题。
Aar*_*and 12
感谢您提供 SQLfiddle 和示例数据!我希望更多的问题以这种方式开始。
如果您想要所有成员,而不管他们是否有该日期的条目,您需要一个LEFT OUTER JOIN
. 您与此版本非常接近,但是外连接的一个小技巧是,如果您向WHERE
子句中的外表添加过滤器,则会将外连接转换为内连接,因为它将排除NULL
该侧的任何行(因为它不知道是否NULL
匹配过滤器)。
我修改了第一个查询以获取每个成员的一行:
SELECT Members.Member_ID
,Time_Entry.Date_Start
,Time_Entry.Hours_Actual
,Time_Entry.Hours_Bill
FROM dbo.Members
LEFT OUTER JOIN dbo.Time_Entry
--^^^^ changed from FULL to LEFT
ON Members.Member_ID = Time_Entry.Member_ID
AND Time_Entry.Date_Start = '20131110';
--^^^ changed from WHERE to AND
Run Code Online (Sandbox Code Playgroud)
我将把它留作练习,让读者从那里拿走它并添加其他列、格式COALESCE
等。
其他一些注意事项:
考虑使用别名使您的查询更易于阅读。例如,上面可以重写为:
SELECT m.Member_ID
,t.Date_Start
,t.Hours_Actual
,t.Hours_Bill
FROM dbo.Members AS m
LEFT OUTER JOIN dbo.Time_Entry AS t
ON m.Member_ID = t.Member_ID
AND t.Date_Start = '20131110';
Run Code Online (Sandbox Code Playgroud)
...更整洁,恕我直言,只要您使用合理的别名。
归档时间: |
|
查看次数: |
59845 次 |
最近记录: |