使用单个 case 语句更新多列

Update Multiple Columns using single case statement

我写的 sql 创建了 4 列:Tier0Tier1Tier2Weight

权重与等级相关联,因此

when Tier0 = 'X' then weight = 0,
when Tier1 = 'X' then weight = 0.7, and
when Tier2 = 'X' then weight = 1.

现在我的 SELECT 语句的这一部分的代码是

CASE 
WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) > (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
THEN 'X' Else '' END AS Tier0,

CASE 
WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) = (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
THEN 'X' Else '' END AS Tier1,

CASE 
WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) < (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
THEN 'X' Else '' END AS Tier2,

CASE 
WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) > (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
THEN 0
WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) = (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
THEN 0.7
WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) < (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
THEN 1  
END AS Weight

有没有办法在前三个 case 语句中包含最后的长 case 语句?

如果可能的话,我希望每个层都有一个 case 语句,它既在正确的层列中放置了一个 X,也正确地更新了权重列。

如有任何帮助,我们将不胜感激。

这条路怎么样?

CASE 
  WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) > (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
  THEN 0
  WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) = (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
  THEN 0.7 
  WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) < (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
  THEN 1  
END AS Weight

您可以使用派生的 table:

SELECT  Tier0,
        Tier1,
        Tier2,
        CASE 
            WHEN Tier0 = 'X' THEN 0
            WHEN Tier1 = 'X' THEN 0.7
            WHEN Tier2 = 'X' THEN 1
        END [Weight]
FROM (Your current query here) AS T;

或 CTE:

;WITH CTE AS
(
    Your current query here
)
SELECT  Tier0,
        Tier1,
        Tier2,
        CASE 
            WHEN Tier0 = 'X' THEN 0
            WHEN Tier1 = 'X' THEN 0.7
            WHEN Tier2 = 'X' THEN 1
        END [Weight]
FROM CTE;

您可以计算 CTE 中的 Tier0Tier1Tier2 列,然后用它来计算 Weight 列:

with cte as (
  select 
    CASE 
    WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) > (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
    THEN 'X' Else '' END AS Tier0,

    CASE 
    WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) = (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
    THEN 'X' Else '' END AS Tier1,

    CASE 
    WHEN (SUM(vst.len_of_stay) / COUNT(vst.len_of_stay)) < (SUM(drg.drg_std_days_stay) / COUNT(drg.drg_std_days_stay))
    THEN 'X' Else '' END AS Tier2

  FROM ...)
SELECT Tier0, Tier1, Tier2,
       case when Tier0 = 'X' then 0
            when Tier1 = 'X' then 0.7
            when Tier2 = 'X' then 1
        end as weight
  from cte

至少这有助于复制逻辑。