sql-server - 基于日期的多组按 T-SQL 查询

标签 sql-server database tsql

首先,请执行较长的问题,但我会尽量简单地说...

我正在尝试编写一种报告查询,但在获得所需结果时遇到了问题。问题:

员工表

Id   |   Name                   
---------------
1    |   John Smith
2    |   Alan Jones
3    |   James Jones

任务表

Id   |   Title   |   StartDate   |   EmployeeId  |  Estimate (integer - ticks)
----------------------------------------------------------------------------
1    |   task1   |   21.08.2011  |   1           |   90000000000
2    |   task2   |   21.08.2011  |   1           |   150000000
3    |   task3   |   22.08.2011  |   2           |   1230000000

问题:

如何获取每天的估算摘要,分组但包括所有员工?

像这样:

Date           |   EmployeeId   |   EmployeeName    |    SummaryEstimate
 -------------------------------------------------------------
19.08.2011     |   1            |   John Smith      |    NULL
19.08.2011     |   2            |   Alan Jones      |    NULL
19.08.2011     |   3            |   James Jones     |    NULL
20.08.2011     |   1            |   John Smith      |    NULL
20.08.2011     |   2            |   Alan Jones      |    NULL
20.08.2011     |   3            |   James Jones     |    NULL
21.08.2011     |   1            |   John Smith      |    90150000000
21.08.2011     |   2            |   Alan Jones      |    NULL
21.08.2011     |   3            |   James Jones     |    NULL
22.08.2011     |   1            |   John Smith      |    NULL
22.08.2011     |   2            |   Alan Jones      |    1230000000
22.08.2011     |   3            |   James Jones     |    NULL

我目前所做的是我有一个包含 30 年天数的“日期”表。我离开了该表的加入和分组,以便也包括其他日期。那么,这里是查询:

  SELECT  dates.value, employee.Id, employee.Name, sum(task.Estimate)

  FROM TableOfDates as dates
  left join Tasks as task on (dates.value = convert(varchar(10), task.StartTime, 101))
  left join Employees as employee on (employee.Id = task.EmployeeId)

  WHERE dates.value >= '2011-08-19' and dates.value < '2011-08-22'

  GROUP BY dates.value, employee.Id, employee.Name

  ORDER BY dates.value, employee.Id

convert 调用是获取 DateTime 列的日期部分。

我得到的结果是:

Date           |   EmployeeId   |   EmployeeName    |    SummaryEstimate
 -------------------------------------------------------------
19.08.2011     |   NULL         |   NULL            |    NULL
20.08.2011     |   NULL         |   NULL            |    NULL
21.08.2011     |   1            |   John Smith      |    90150000000    
22.08.2011     |   2            |   Alan Jones      |    1230000000

我已经走到一半了,我得到的日期不在两个基本联接表(员工和任务)中,但我也不能像之前显示的表中那样包含所有员工。

我尝试过交叉连接,然后是子查询,但运气不佳。任何帮助将不胜感激!感谢您有时间完成所有这些,我希望我已经足够清楚...

最佳答案

SELECT DE.DateValue, DE.EmployeeId, DE.EmployeeName, sum(task.Estimate)

FROM 
(  SELECT
     D.value AS DateValue
   , E.Id AS EmployeeId
   , E.Name AS EmployeeName
   FROM
   TableOfDates D      
   CROSS JOIN Employees E ) DE
left join Tasks as task on DE.DateValue = convert(varchar(10), task.StartTime, 101)
  AND DE.EmployeeId = task.EmployeeId

WHERE DE.DateValue >= '2011-08-19' and DE.DateValue < '2011-08-22'

GROUP BY DE.DateValue, DE.EmployeeId, DE.EmployeeName

ORDER BY DE.DateValue, DE.EmployeeId

关于sql-server - 基于日期的多组按 T-SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7147011/

相关文章:

sql-server - SQL Server 作业超时

sql-server - 我的 SQL2008 实例在哪个端口上运行?

sql-server - 从 native iOS 应用程序查询 SQL Server 数据库

php - 为什么在以下情况下未导入数据库转储?

mysql - 最优数据库结构

java - Room Persistence 库 - 带有 List<Video> 的嵌套对象,@Embedded 不起作用。

sql - 如何在SQL中从XML中获取指定的节点

c# - 基于本地文件的 SQL Server

tsql - 将多行转换为一行,并以逗号作为分隔符

sql-server - 在函数中设置日期优先