我需要帮助编写一个T-SQL查询,该查询将从一个表中生成52行数据,该表通常包含每个特许经营52周序列中的空白(即,特许经营可能每两周报告一次数据或已经没有经营一整年。)
我正在查询的表看起来像这样:
FranchiseId | Date | ContractHours | PrivateHours
我需要将它加入到与此类似的表中:
FranchiseId | Name
查询的输出必须如下所示:
Name | Date | ContractHours | PrivateHours
---- ---------- ------------- ------------
AZ1 08-02-2011 292 897
AZ1 07-26-2011 0 0 -- default to 0's for gaps in sequence
...
AZ1 08-03-2010 45 125 -- row 52 for AZ1
AZ2 08-02-2011 382 239
...
AZ2 07-26-2011 0 0 -- row 52 for AZ2
对于每个特许经营,我需要这种输出方式,即52行数据,对于52周序列中的任何间隙,在单个结果集中具有默认行。因此,如果有100个特许经营权,那么结果集应该是5200行。
我尝试过什么
我尝试了以下的典型建议:
我遇到的问题是
填补与特许经营名称的差距和0小时,我不能 在结果集中包含以下内容:
Name | Date | ContractHours | PrivateHours
---- ---------- ------------- ------------
NULL 08-02-2011 NULL NULL
我不知道从哪里开始?是否有一种有效的方法来编写将产生所需输出的T-SQL查询?
答案 0 :(得分:4)
裸骨是这个
所以,像这样,未经测试
;WITH cDATE AS
(
SELECT
CAST('20100101' AS date /*smalldatetime*/) AS StartOfWeek,
CAST('20100101' AS date /*smalldatetime*/) + 6 AS EndOfWeek
UNION ALL
SELECT StartOfWeek + 7, EndOfWeek + 7
FROM cDATE WHERE StartOfWeek + 7 < '20110101'
), Possibles AS
(
SELECT
StartOfWeek, FranchiseID
FROM
cDATE CROSS JOIN Franchise
)
SELECT
P.FranchiseID,
P.StartOfWeek,
ISNULL(SUM(O.ContractHours), 0),
ISNULL(SUM(O.PrivateHours), 0)
FROM
Possibles P
LEFT JOIN
TheOtherTable O ON P.FranchiseID = O.FranchiseID AND
O.Date BETWEEN P.StartOfWeek AND P.EndOfWeek
GROUP BY
P.FranchiseID