我正在使用SQL Server 2008 R2。SQL:按连续日期计算记录数,即使某个日期不存在记录
我在查询一张医院预约插槽表,并试图返回特定医生有多少预约插槽的列表被标记为预订,按周/年编组。
有些星期没有任何预约约会,但我希望结果列出所有即将到来的星期,即使预约的预约时间段数为零。
我要找的输出是沿着这些线路:
-------------------------------------------
Year | Week Number | Number of Booked Slots
-------------------------------------------
2017 | 48 | 10
2017 | 49 | 0
2017 | 50 | 4
2017 | 51 | 2
2017 | 52 | 0
2018 | 1 | 5
我明白,一个标准选择综合这些结果将不会显示那些星期那里有一个记录计数为零,因为没有什么返回 - 所以我试图通过使用cte来首先产生所有即将到来的几周的列表。
然而,几经努力我可能,我不能得到查询显示零周...
我已经看到了一些类似的问题本解决方案,但尽管我尝试避风港” (包括SQL Count to include zero values)
这是我迄今为止编写的查询的最新版本。
WITH CTE_Dates AS
(
SELECT DISTINCT Slot_Start_Date AS cte_date
FROM [Outpatients.vw_OP_Clinic_Slots WITH (NOLOCK)
)
SELECT
DATEPART(year,OPCS.Slot_Start_Date) [Year]
,DATEPART(week,OPCS.Slot_Start_Date) [Week Number]
,count(OPCS.Slot_Start_Date) [Number of Booked Slots]
FROM
Outpatients.vw_OP_Clinic_Slots OPCS WITH (NOLOCK)
LEFT OUTER JOIN CTE_Dates ON OPCS.Slot_Start_Date=CTE_Dates.cte_date
LEFT OUTER JOIN Outpatients.vw_OP_Clinics CLIN ON OPCS.Clinic_Code=CLIN.Clinic_Code
WHERE
OPCS.Slot_Start_Date >= '14/08/2017'
AND OPCS.Booked_Flag = 'Y'
AND CLIN.Lead_Healthcare_Professional_Name = 'Dr X'
GROUP BY
DATEPART(year,OPCS.Slot_Start_Date)
,DATEPART(week,OPCS.Slot_Start_Date)
ORDER BY
DATEPART(year,OPCS.Slot_Start_Date)asc
,DATEPART(week,OPCS.Slot_Start_Date)asc
它返回的结果是正确的,但我只是需要它包括那些星期在计数为零的列表中。
请任何人都可以解释我要去哪里错了?我猜测我没有正确加入cte,但是我已经尝试了右侧和左侧连接,它们会产生相同的结果。我也试着通过swopping上面的查询语句和cte来反转查询,但是这也不起作用。
欣赏任何人可以建议的指导。
感谢您的帮助@Bartosz X.不幸的是,这是不是为我工作 - 我得到的错误'操作数类型冲突:日期与int不兼容也许我没有正确的连接语法?我已经使用了:'RIGHT JOIN @ListOfWeeks ON OPCS.Slot_Start_Date = Week_No'这是正确的吗? – Jon295087
不,加入week_number而不是 –
对不起@Bartosz_X我仍然无法完成这项工作。我试着:'RIGHT JOIN @ListOfWeeks ON DATEPART(week,OPCS.Slot_Start_Date)= Week_No',但它仍然给我没有零星期的相同结果。我尝试加入[Week_Number],但这会产生错误:'Week_Number'附近的语法错误。'我假设因为[Week Number]是别名列,您无法加入它?感谢你的帮助 - 请你能更具体地帮助我理解吗? – Jon295087