Tsql 需要帮助编写日期敏感的T-SQL查询吗

Tsql 需要帮助编写日期敏感的T-SQL查询吗,tsql,sql-server-2008,date,Tsql,Sql Server 2008,Date,我需要帮助编写一个T-SQL查询,该查询将从一个表中生成每个特许经营52行数据,该表通常包含每个特许经营52周序列中的间隔,即,特许经营可能每两周报告一次数据,或者已经一整年没有营业了 我要查询的表如下所示: Name | Date | ContractHours | PrivateHours ---- ---------- ------------- ------------ AZ1 08-02-2011 292 89

我需要帮助编写一个T-SQL查询,该查询将从一个表中生成每个特许经营52行数据,该表通常包含每个特许经营52周序列中的间隔,即,特许经营可能每两周报告一次数据,或者已经一整年没有营业了

我要查询的表如下所示:

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
特许经营|日期|合同时间|私人时间

我需要将它连接到一个类似以下的表:

特许经营人|姓名

查询的输出需要如下所示:

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行

我试过的

我尝试了以下典型建议:

创建一个包含所有可能日期的表 左外部将此连接到所需的数据表 我遇到的问题是

确保每个特许经营权有52排 用特许经营权名称和0填补空白几个小时,我不能 在结果集中包含以下内容:

Name | Date       | ContractHours | PrivateHours
----   ----------   -------------   ------------
NULL   08-02-2011            NULL           NULL
我不知道从这里到哪里去?有没有一种有效的方法来编写生成所需输出的T-SQL查询?

基本情况如下

生成52周范围 交叉加盟 左键连接实际日期 ISNULL以替换零 所以,像这样,未经测试

;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
事实就是这样

生成52周范围 交叉加盟 左键连接实际日期 ISNULL以替换零 所以,像这样,未经测试

;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

@gbn谢谢!这真的帮助了我,我能够生成我想要的结果集。@gbn谢谢!这确实帮助了我,我能够生成我想要的结果集。