【发布时间】:2021-05-02 00:15:48
【问题描述】:
我有以下代码,用于计算这些客户在进入特定医院([程序])后 12 个月内无家可归时的唯一客户数 [ClientWHID] 和天数, 请看下文。
我想知道,是否有更优雅的方式来编写这段代码? 例如,用 CASE 语句替换括号 cte 中的子选择? 还是在这种情况下不可能?
DECLARE @BOP date = '07/01/2019'
DECLARE @EOP date = '06/30/2020'
DECLARE @EHRProgramWHID int = -1; -- 54500457 = SM AOT; 54200471 = SM FSP
SELECT
cte.[EHRProgramWHID]
,cte.[ProgramName]
,COUNT( DISTINCT cte.[ClientWHID]) AS [# Homeless Clients 12 Mo after Enrollment]
,SUM (cte.[# Homeless Days]) AS [# Homeless Days 12 Mo after Enrollment]
FROM
(
SELECT
epi.[EHRProgramWHID]
,prg.[ProgramName]
,epi.[Domain]
,epi.[Subdomain]
,epi.[ClientWHID]
,epi.[BeginDate]
,epi.[EndDate]
,IIF(epi.[BeginDate] < @BOP, @BOP, epi.[BeginDate]) AS [Upd_BeginDate]
,IIF(epi.[EndDate] > @EOP, @EOP, epi.[EndDate]) AS [Upd_EndDate]
,DATEDIFF(day, IIF(epi.[BeginDate] < @BOP, @BOP, epi.[BeginDate]),
IIF(epi.[EndDate] > @EOP, @EOP, epi.[EndDate])) AS [# Homeless Days]
FROM
WHMHSA.[DomainStatusEpisodes] epi
INNER JOIN [Dimension].[Program] prg ON epi.[EHRProgramWHID] = prg.[WHID]
WHERE
NOT( ( (epi.BeginDate < @BOP) AND (epi.EndDate < @BOP) ) OR
( (epi.BeginDate > @EOP) AND (epi.EndDate > @EOP) ) )
AND (epi.Domain = 'Residential')
AND (epi.Subdomain = 'Homeless')
AND (epi.EHRProgramWHID IN (54500457, 54200471))
) cte
GROUP BY
cte.[EHRProgramWHID]
,cte.[ProgramName]
ORDER BY
cte.[ProgramName]
【问题讨论】: