【问题标题】:A challenge for you SQL lovers out there对 SQL 爱好者的挑战
【发布时间】:2014-03-26 21:34:02
【问题描述】:

我是职场新人,刚从大学毕业。作为培训的一部分,我开始通过 SQL 报告服务创建一些报告。

这是一个让我陷入困境的挑战。请帮我完成这个查询。事情是这样的!

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

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

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

这可能很棘手,不是每个人都在 leavetable 中有条目,但每个人都有在 Time_Sheet 表中的活动。

这是我到目前为止从查询中得到的结果,但它并没有真正帮助我。

很遗憾,我无法上传图片,所以这里有一个链接

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

哦,是的,我喜欢的 SQL 是 SQL Server

【问题讨论】:

    标签: sql-server reporting-services


    【解决方案1】:

    你需要在这里攻击一些不同的东西。

    首先是从employee_table 获取信息,而不管其他两个表中的内容。为此,我会在两张桌子上left join

    您的第二场战斗是,现在由于您的time_sheet 表中有多行,您将获得每条time_sheet 记录的记录。那不是你想要的。您可以通过使用 SUM Aggregate 和 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

    【讨论】:

    • 谢谢,它确实让我比以前更进一步......但是请检查我的截图所附的链接,由于某种原因,我的假期越来越疯狂。 Emp 8 仅在 LeaveTable 中有 1 天休假,Emp 2 只有 5 天。 imageshack.com/a/img22/3031/fq6o.jpg
    • 而且,由于某种原因,Total_Hours 乘以 leaveTable 中的条目数量。 Emp 2 在时间表中只有 70 小时,但在屏幕截图上显示为 280 小时!我假设它是相乘的,因为 Emp 2 在 leaveTable (4*70 = 280) 中有 4 个条目
    • 那是我的错,我没有想通。我更改了查询并添加了 sql fiddle。这应该会为您解决这个问题。
    【解决方案2】:

    Left join请假表,如果没有人请假,您将不会得到任何结果。

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 2018-06-04
      • 1970-01-01
      • 2022-11-10
      • 2016-08-10
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      相关资源
      最近更新 更多