2011-08-05 89 views
0

我需要幫助編寫一個T-SQL查詢,該查詢將從每張特許經營的52周序列中經常包含空白的表中生成52行數據(即,特許經營可能每兩週報告一次數據,或者全年沒有營業)。需要幫助寫一個日期敏感的T-SQL查詢

我對查詢的表格看起來是這樣的:

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查詢?

回答

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 
+0

+1 - 擊敗我'CROSS JOIN'。 – JNK

+0

@gbn謝謝!這真的幫了我很大的忙,我能夠生成我正在尋找的結果集。 – sellmeadog