【问题标题】:need help writing a date sensitive T-SQL query需要帮助编写对日期敏感的 T-SQL 查询
【发布时间】:2011-10-21 03:29:07
【问题描述】:

我需要帮助编写一个 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 JOIN 将此加入所需数据表

我遇到的问题是

  1. 确保每个特许经营店有 52 行,并且
  2. 用特许经营名称和 0 填补空白,我不能 结果集中有以下内容:

    Name | Date       | ContractHours | PrivateHours
    ----   ----------   -------------   ------------
    NULL   08-02-2011            NULL           NULL
    

我不知道从这里去哪里?有没有一种有效的方法来编写 T-SQL 查询来产生所需的输出?

【问题讨论】:

    标签: tsql sql-server-2008 date


    【解决方案1】:

    最基本的是这个

    • 生成 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
    

    【讨论】:

    • @gbn 谢谢!这真的帮助了我,我能够生成我正在寻找的结果集。
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多