【问题标题】:Possible use of a more elegant statement instead of sub select, in T-SQL在 T-SQL 中可能使用更优雅的语句而不是子选择
【发布时间】: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]
  

【问题讨论】:

    标签: tsql subquery case


    【解决方案1】:

    由于除了EHRProgramWHIDProgramNameClientWHID之外,您没有使用CTE部分的任何列,因此无需返回它们。

    没有样本数据我无法检查,但请尝试:

     DECLARE @BOP date = '07/01/2019'
     DECLARE @EOP date = '06/30/2020'
     DECLARE @EHRProgramWHID int = -1;  --  54500457 = SM AOT; 54200471 = SM FSP
    
     SELECT 
        epi.[EHRProgramWHID]
       ,prg.[ProgramName]
       ,COUNT( DISTINCT epi.[ClientWHID]) AS [# Homeless Clients 12 Mo after Enrollment]
       ,SUM (DATEDIFF(day, IIF(epi.[BeginDate] < @BOP, @BOP, epi.[BeginDate]), 
                             IIF(epi.[EndDate] > @EOP, @EOP, epi.[EndDate]))) AS [# Homeless Days 12 Mo after Enrollment]
    
    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))
    GROUP BY
         epi.[EHRProgramWHID]
        ,prg.[ProgramName]
    
    ORDER BY
         prg.[ProgramName]
    

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2020-07-30
      相关资源
      最近更新 更多