Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL使用CTE和PIVOT制作月份日历_Sql_Sql Server_Pivot_Case_Common Table Expression - Fatal编程技术网

SQL使用CTE和PIVOT制作月份日历

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

我正在尝试构建一个CTE,为我提供一个从开始日期到
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,我现在开始工作了,我不得不稍微修改一下语法来完成它,但是经过一点帮助和修改,它成功了,非常感谢