【问题标题】:SQL use CTE and PIVOT to make Calender of MonthsSQL 使用 CTE 和 PIVOT 制作月份日历
【发布时间】: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


【解决方案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

【讨论】:

  • 您好,我不确定我是否理解,我该如何处理我的案例陈述和日期添加功能。在我将日期转换为日期名称之前,我需要那些在那里,目前如果我将日期名称与日期添加一起使用,我会从字符串中获取转换日期或时间。提前致谢
  • 我更改了答案中的语法。您仍然可以使用过滤器。如果还不是您的答案,请告诉我解决方案出了什么问题。
  • 嗨,Wietze,我得到了它,我现在必须使用一些语法来完成它,但在一些帮助和修改下设法让它工作,非常感谢
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多