下面我有一个在SQL Server中运行的简单case表达式。我期望看到的结果是超过12个HRS,超过25个HRS,超过45个HRS,等等。然而,我的结果只返回超过12个小时和少于12个小时。
SELECT
STORE,
CASE
WHEN HOURS >12 THEN 'Over 12 HRS'
WHEN HOURS >25 THEN 'Over 25 HRS'
WHEN HOURS >45 THEN 'Over 45 HRS'
WHEN HOURS >55 THEN 'Over 55 HRS'
WHEN HOURS >75 THEN 'Over 75 HRS'
WHEN HOURS >94 THEN 'Over 94 HRS'
ELSE 'Less 12 HRS'
END AS HOURS,
COUNT (ID) AS PRD
FROM
(
SELECT
ID,
STORE,
HOURS
FROM TABLE A
)X
GROUP BY STORE,
CASE
WHEN HOURS >12 THEN 'Over 12 HRS'
WHEN HOURS >25 THEN 'Over 25 HRS'
WHEN HOURS >45 THEN 'Over 45 HRS'
WHEN HOURS >55 THEN 'Over 55 HRS'
WHEN HOURS >75 THEN 'Over 75 HRS'
WHEN HOURS >94 THEN 'Over 94 HRS'
ELSE 'Less 12 HRS'
END 发布于 2017-08-25 02:16:30
这是因为您以错误的方式对案例进行了排序:当HOURS >94为true时,HOURS >12也必须为true,因此HOURS >94必须排在HOURS >12之前。
一般来说,条件必须从强到弱排序,而不是从强到弱。
以相反的方式重新排序列表将解决此问题:
CASE
WHEN HOURS >94 THEN 'Over 94 HRS'
WHEN HOURS >75 THEN 'Over 75 HRS'
WHEN HOURS >55 THEN 'Over 55 HRS'
WHEN HOURS >45 THEN 'Over 45 HRS'
WHEN HOURS >25 THEN 'Over 25 HRS'
WHEN HOURS >12 THEN 'Over 12 HRS'
ELSE 'Less 12 HRS'
END AS HOURS发布于 2017-08-25 02:16:54
case在第一个匹配的行处停止,因此13小时满足第一个条件,23小时和75小时也是如此,依此类推。
你需要颠倒逻辑。一种简单的方法是颠倒比较顺序:
(CASE WHEN HOURS <= 12 THEN 'Less 12 HRS'
WHEN HOURS <= 25 THEN 'Over 12 HRS'
WHEN HOURS <= 45 THEN 'Over 25 HRS'
WHEN HOURS <= 55 THEN 'Over 45 HRS'
WHEN HOURS <= 75 THEN 'Over 55 HRS'
WHEN HOURS <= 94 THEN 'Over 75 HRS'
ELSE 'Over 94 HRS'
END) AS HOURS,我还建议您重命名这些组。类似于:
(CASE WHEN HOURS <= 12 THEN '00-12 HRS'
WHEN HOURS <= 25 THEN '12-25 HRS'
WHEN HOURS <= 45 THEN '25-45 HRS'
WHEN HOURS <= 55 THEN '45-55 HRS'
WHEN HOURS <= 75 THEN '55-75 HRS'
WHEN HOURS <= 94 THEN '75-94 HRS'
ELSE '94+ HRS'
END) AS HOURS,发布于 2017-08-25 02:17:11
25、45、55、75和94都大于12。因此第一个条件检查匹配,不需要进一步求值。你可以这样写它:
CASE
WHEN HOURS >94 THEN 'Over 94 HRS'
WHEN HOURS >75 THEN 'Over 75 HRS'
WHEN HOURS >55 THEN 'Over 55 HRS'
WHEN HOURS >45 THEN 'Over 45 HRS'
WHEN HOURS >25 THEN 'Over 25 HRS'
WHEN HOURS >12 THEN 'Over 12 HRS'
ELSE 'Less 12 HRS'
END https://stackoverflow.com/questions/45868369
复制相似问题