【发布时间】:2017-08-17 11:00:24
【问题描述】:
我使用的是 SQL Server 2008 R2。
我正在查询医院预约空档表,并尝试返回一个列表,其中列出了标记为已预订的特定医生的预约空档数量,按周数/年分组。
有些情况下几周还没有任何预约,但我希望结果列出所有未来几周,即使预约的预约空档数为零。
我正在寻找的输出是这样的:
-------------------------------------------
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,但我已经尝试了产生相同结果的右连接和左连接。我还尝试通过交换上述查询语句和 cte 来反转查询,但这也不起作用。
感谢任何人可以提供的任何指导。
【问题讨论】:
标签: sql sql-server sql-server-2008 tsql