使用单个 case 语句更新多列
Update Multiple Columns using single case statement
我写的 sql 创建了 4 列:Tier0
、Tier1
、Tier2
和 Weight
。
权重与等级相关联,因此
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 中的 Tier0
、Tier1
、Tier2
列,然后用它来计算 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
至少这有助于复制逻辑。
我写的 sql 创建了 4 列:Tier0
、Tier1
、Tier2
和 Weight
。
权重与等级相关联,因此
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 中的 Tier0
、Tier1
、Tier2
列,然后用它来计算 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
至少这有助于复制逻辑。