2013-09-23 62 views
0

我想建立一個CTE給我的開始日期和GETDATE()即星期一,星期二,星期三的數量之間的天日曆日曆等SQL使用CTE和樞軸,使月

我有有需要之前日曆計數得到滿足,如果是1 2或3將使用日期添加天數增加它能夠完成

我的有效起始日期條件和應該做這樣的case語句一直持續到GETDATE()

我知道我需要使用樞軸,但似乎遇到了不少麻煩樞軸與CTE工作,

WITH CTE 
AS (
    select MR.ContractId B2,Name A1, EffectiveStartDate A ,swd2.Id B 
    FROM [VES.DES].dbo.MasterRound mr LEFT JOIN [VES.DES].dbo.ScheduledWeekDay swd2 
       ON MR.RoundRecurrenceId = SWd2.Id 

    UNION ALL 

    SELECT 
      B2,A1, 
      CASE  
      When B = 2 Then DATEADD(D,+7,A) 
      When B = 1 Then DATEADD(D,+1,A) 
      When B = 3 Then DATEADD(D,+14,A) END AS A, B 

    FROM CTE WHERE A < GETDATE()) 

SELECT * FROM CTE 
WHERE CTE.B2 = '12' 
AND DATEPART(m, A) = DATEPART(m, DATEADD(m, -1, getdate())) 
option (maxrecursion 0) 

最終輸出我要的是

NAME(A1), Month, MON, Tues, WED, Thu, Fri, Sat, Sun 
---------------------------------------------------  
FW1  JAN 4  3  4 5 3 4 2 
FW3  FEB 4  5  4 4 4 4 5 

任何幫助將是偉大的,因爲我明白這是相當複雜

+1

你爲什麼不建立一個CTE壓延榜第一,並使用該表中更加複雜的部分。我沒有完全學習你的語法,但看起來你正在做CTE第一部分的所有事情,然後在第二部分中選擇所有的東西。這使得它成爲一個複雜的聯盟,並重復相同的聯合。如果你在第二部分進行加入,你只需要做一次。 – Wietze314

+0

感謝您的提示,我將現在嘗試, – user2040295

+0

謝謝Wietze我根據您的評論創建了一個完全不同的查詢應該給我相同的結果,但是我現在卡在樞軸上,所以如果你能幫助我們與這將不勝感激。 – user2040295

回答

1

我認爲這將是更容易與CTE組合不使用PIVOT。

使用GROUP BY像

SELECT 
A1, 
SUM(
CASE WHEN DATEPART(DW, A) = 1 THEN 1 ELSE 0 END 
) AS Sunday 
, 
SUM(
CASE WHEN DATEPART(DW, A) = 2 THEN 1 ELSE 0 END 
) AS Monday 

FROM CTE 

WHERE CTE.B2 = '12' 
AND DATEPART(m, A) = DATEPART(m, DATEADD(m, -1, getdate())) 
option (maxrecursion 0) 

GROUP BY A1 
+0

嗨,我不完全確定我明白,我怎麼處理我的病例陳述和日期添加功能。我需要那些在那裏之前我把日期轉換成日期名稱,此刻如果我使用日期名稱與日期添加我從字符串獲得轉換日期或時間。在此先感謝 – user2040295

+0

我改變了我的答案中的語法。您仍然可以使用該過濾器。如果還不是您的答案,請告訴我該解決方案有什麼問題。 – Wietze314

+0

嗨Wietze我得到它的工作現在不得不演奏一點點的語法來完成它,但有一點幫助和修改設法讓它的工作,感謝一堆非常讚賞 – user2040295