SQL使用CTE和PIVOT制作月份日历
我正在尝试构建一个CTE,为我提供一个从开始日期到SQL使用CTE和PIVOT制作月份日历,sql,sql-server,pivot,case,common-table-expression,Sql,Sql Server,Pivot,Case,Common Table Expression,我正在尝试构建一个CTE,为我提供一个从开始日期到GETDATE()日期之间的日历,即周一、周二、周三等的数量 我有一个案例陈述,其中包含了在日历计数完成之前需要满足的条件 如果“我的有效开始日期”为1、2或3,则将使用“日期添加”向其添加天数,并应连续执行此操作,直到GETDATE() 我知道我需要使用pivot,但似乎在让pivot与CTE一起工作时遇到了很多问题 WITH CTE AS ( select MR.ContractId B2,Name A1, EffectiveStart
GETDATE()
日期之间的日历,即周一、周二、周三等的数量
我有一个案例陈述,其中包含了在日历计数完成之前需要满足的条件
如果“我的有效开始日期”为1、2或3,则将使用“日期添加”向其添加天数,并应连续执行此操作,直到GETDATE()
我知道我需要使用pivot,但似乎在让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)
任何帮助都会很好,因为我知道这相当复杂我认为使用CTE组合不使用PIVOT会更容易 使用类似的组
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
我认为使用CTE组合会更容易不使用PIVOT 使用类似的组
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
为什么不先创建一个CTE日历表,并在更复杂的部分使用该表呢。我没有充分研究你的语法,但似乎你在做CTE第一部分的所有事情,然后在第二部分选择所有事情。这使它成为一个复杂的并集,重复相同的连接。如果你在第二部分做连接,你只需要做一次。谢谢你的提示,我现在会尝试,谢谢Wietze,我根据你的评论创建了一个完全不同的查询,应该会给我相同的结果,然而,我现在被困在轴上,如果您能帮助我们,我们将不胜感激。为什么不先创建一个CTE日历表,并在更复杂的部分使用该表。我没有充分研究你的语法,但似乎你在做CTE第一部分的所有事情,然后在第二部分选择所有事情。这使它成为一个复杂的并集,重复相同的连接。如果你在第二部分做连接,你只需要做一次。谢谢你的提示,我现在会尝试,谢谢Wietze,我根据你的评论创建了一个完全不同的查询,应该会给我相同的结果,然而,我现在被困在枢轴上,因此如果您能帮助我们,我将不胜感激。嗨,我不完全确定我是否理解,我该如何处理我的案例陈述和日期添加功能。在我将日期转换为日期名称之前,我需要这些数据,如果我将日期名称与日期添加一起使用,我将从字符串中获得转换日期或时间。提前谢谢我修改了答案中的语法。您仍然可以使用过滤器。如果不是你的答案,请告诉我解决方案有什么问题。嗨,Wietze,我现在开始工作了,我不得不稍微修改一下语法来完成它,但是经过一点帮助和修改,它成功了,非常感谢大家,我不完全确定我是否理解,我该如何处理我的case语句和dateadd函数。在我将日期转换为日期名称之前,我需要这些数据,如果我将日期名称与日期添加一起使用,我将从字符串中获得转换日期或时间。提前谢谢我修改了答案中的语法。您仍然可以使用过滤器。让我知道这个解决方案有什么问题,如果它还不是你的答案。嗨,Wietze,我现在开始工作了,我不得不稍微修改一下语法来完成它,但是经过一点帮助和修改,它成功了,非常感谢