2013-09-23 45 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