【发布时间】:2013-09-23 14:15:12
【问题描述】:
我正在尝试构建一个 CTE,以给我一个开始日期和 GETDATE() 之间天数的日历,即星期一、星期二、星期三等的数量。
我有一个 case 语句,其中包含在日历计数完成之前需要满足的条件
如果是 1 2 或 3,我的有效开始日期将使用 Date-Add 将天数添加到它,并且应该持续执行此操作直到 GETDATE()。
我知道我需要使用支点,但似乎很难让 PIVOT 与 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
任何帮助都会很棒,因为我知道这很复杂
【问题讨论】:
-
为什么不先创建一个 CTE 日历表,然后在更复杂的部分使用该表。我没有完全研究你的语法,但似乎你在 CTE 的第一部分做了所有事情,然后在第二部分选择了所有内容。这使它成为一个复杂的联合,重复相同的连接。如果您在第二部分中进行连接,则只需执行一次。
-
感谢您的提示,我现在将尝试,
-
感谢 Wietze,我根据您的评论创建了一个完全不同的查询,它应该给我相同的结果,但是我现在被困在枢轴上,所以如果您能帮助我们,我们将不胜感激.
标签: sql sql-server pivot case common-table-expression