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

时间:2011-08-05 19:10:21

标签: tsql sql-server-2008 date

我需要帮助编写一个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行。

我尝试过什么

我尝试了以下的典型建议:

  • 创建一个包含所有可能日期的表格
  • LEFT OUTER将此连接到所需的数据表

我遇到的问题是

  1. 确保每个特许经营权分别为52行和
  2. 填补与特许经营名称的差距和0小时,我不能 在结果集中包含以下内容:

    Name | Date       | ContractHours | PrivateHours
    ----   ----------   -------------   ------------
    NULL   08-02-2011            NULL           NULL
    
  3. 我不知道从哪里开始?是否有一种有效的方法来编写将产生所需输出的T-SQL查询?

1 个答案:

答案 0 :(得分:4)

裸骨是这个

  • 生成52周范围
  • 与特许经营交叉加入
  • LEFT JOIN实际日期
  • 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
相关问题