我目前正在尝试编写一个查询来计算患者天数。我的源表有VisitID,AdmitDateTime和DischargeDateTime。患者日定义为患者在午夜躺在床上。因此,例如,如果在2016-01-01期间有5名患者入院,而且之前没有其他患者住院,那么2016-01-02患者日数将等于5。
我想显示结果,列是日期和计数。我想过用CTE构建一个日历表,但我不确定连接应该对我的源表有什么影响。如果在某一天床上没有患者,我希望计数为0.我对SQL是相当新的,所有的帮助将不胜感激。
答案 0 :(得分:0)
我强烈建议您使用日历表,但如果这不适合您,则可以使用递归CTE构建主日期列表。
请注意,如果您的整体日期范围超过100天,由于cte递归的限制,这不会起作用。 (再次。尝试使用日历表会更有效率。)
如果您需要报告特定月份,那么您需要更改定义[FirstDate]和[LastDate]
的初始cteDROP TABLE #Clientvisit
CREATE TABLE #ClientVisit(
VisitID INT
,AdmitDateTime DATETIME
,DischargeDateTime DATETIME
)
INSERT INTO #ClientVisit
VALUES
(1,'20160604 13:50','20160606 03:50')
,(2,'20160604 13:50','20160609 13:50')
--IF YOU'RE NOT USING A CALENDAR TABLE THEN USE RECURSIVE CTE TO BUILD DATE LIST
;WITH cte
AS
(
SELECT
MIN(CAST(AdmitDateTime AS DATE)) AS FirstDate
,MAX(CAST(DischargeDateTime AS DATE)) AS LastDate
FROM
#ClientVisit
)
,cte_R
AS
(
SELECT FirstDate,LastDate FROM cte
UNION ALL
SELECT DATEADD(DD,1,FirstDate),LastDate FROM cte_R
WHERE DATEADD(DD,1,FirstDate) <= LastDate
)
SELECT
c.FirstDate
,COUNT(v.VisitID) AS BedDays
FROM
cte_R c
LEFT JOIN #ClientVisit v
ON
DATEADD(DD
,1 --PLAY WITH THIS VALUE EITHER -1/0/1 TO ALLIGN THE BEDDAYS WITH THE DESIRED DATE
,c.FirstDate) BETWEEN v.AdmitDateTime AND v.DischargeDateTime
GROUP BY
c.FirstDate