使用单个语句更新多个列

时间:2015-10-07 19:47:03

标签: sql sql-server case

我编写的sql创建了4列:Tier0Tier1Tier2Weight

重量与等级相关联

  

当Tier0 ='X'时,权重= 0,
  当Tier1 ='X'时,重量= 0.7,和
  当Tier2 ='X'时,权重= 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语句,它们都将X放在正确的层列中,并且还正确地更新了权重列。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:4)

您可以使用派生表:

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;

答案 1 :(得分:1)

这是怎么回事?

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

答案 2 :(得分:0)

您可以计算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

至少这有助于复制逻辑。