【发布时间】:2014-09-26 21:14:46
【问题描述】:
我有需要按日期范围创建报告的时间表数据。我需要为每个人每天和每个时间类型设置一行。如果在给定日期没有该时间类型的条目,我想要空数据。我尝试了左连接,但它似乎不起作用。交叉连接会给出错误的数据。
我拥有的表是 Person 表 (personID, Name)、TimeLog 表 (TimeLogID, StartDate, EndDate, TimeLogTypeID) 和 TimeLogType 表 (TimeLogTypeID, PersonID, Description, DeletedInd)
我能在结果集中得到的只是包含数据的行,而不是每个 TimeLogType 的空行
这是我目前所拥有的:
DECLARE
@startDate DATE,
@endDate DATE
SET @startDate = '2014-05-01'
SET @endDate = '2014-05-30'
SELECT
CONVERT(DATE, TimeLog.StartDateTime, 101) AS TimeLogDay,
SUM(dbo.fnCalculateHoursAsDecimal(TimeLog.StartDateTime, TimeLog.EndDateTime)) AS Hours,
TimeLog.PersonID,
TimeLog.TimeLogTypeID
INTO #HourTable
FROM
TimeLog
WHERE
TimeLog.StartDateTime BETWEEN @startDate AND @endDate
GROUP BY
CONVERT(DATE, TimeLog.StartDateTime, 101),
TimeLog.TimeLogTypeID,
TimeLog.PersonID
SELECT
TimeLogType.Description,
#HourTable.*
FROM
TimeLogType LEFT JOIN
#HourTable ON TimeLogType.TimeLogTypeID = #HourTable.TimeLogTypeID
WHERE
ISNULL(TimeLogType.DeletedInd, 0) = 0
ORDER BY
PersonID, TimeLogDay, TimeLogType.TimeLogTypeID
数据是这样的:
时间日志类型:
1、可计费
2、不计费
人:
1、比利
2、汤姆
时间日志:
1, 1, 2014-05-01 08:00:00, 2014-05-01 09:00:00, 1, 0
2, 1, 2014-05-01 09:00:00, 2014-05-01 10:00:00, 1, 0
3, 2, 2014-05-01 08:00:00, 2014-05-01 08:30:00, 2, 0
4, 2, 2014-05-01 08:30:00, 2014-05-01 09:00:00, 1, 0
5, 1, 2014-05-02 08:00:00, 2014-05-02 09:00:00, 2, 0
预期输出:(按人、日期、时间日志类型排序)
天、人、账单类型、总小时数
2014-05-01, 比利, Billiable, 2.0
2014-05-01,Billy,不可计费,NULL
2014-05-02, 比利, Billiable, 1.0
2014-05-02,Billy,不可计费,NULL
等等...
2014-05-01,汤姆,Billiable,0.5
2014-05-01,汤姆,不可开票,0.5
等等……
【问题讨论】:
-
你能提供表格中的样本数据吗?
-
和一个简短但描述性的预期输出示例
标签: sql sql-server sql-server-2012