首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL中的Case表达式

SQL中的Case表达式
EN

Stack Overflow用户
提问于 2017-08-25 02:14:16
回答 3查看 59关注 0票数 0

下面我有一个在SQL Server中运行的简单case表达式。我期望看到的结果是超过12个HRS,超过25个HRS,超过45个HRS,等等。然而,我的结果只返回超过12个小时和少于12个小时。

代码语言:javascript
运行
复制
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 
EN

回答 3

Stack Overflow用户

发布于 2017-08-25 02:16:30

这是因为您以错误的方式对案例进行了排序:当HOURS >94为true时,HOURS >12也必须为true,因此HOURS >94必须排在HOURS >12之前。

一般来说,条件必须从强到弱排序,而不是从强到弱。

以相反的方式重新排序列表将解决此问题:

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-08-25 02:16:54

case在第一个匹配的行处停止,因此13小时满足第一个条件,23小时和75小时也是如此,依此类推。

你需要颠倒逻辑。一种简单的方法是颠倒比较顺序:

代码语言:javascript
运行
复制
(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,

我还建议您重命名这些组。类似于:

代码语言:javascript
运行
复制
(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,
票数 0
EN

Stack Overflow用户

发布于 2017-08-25 02:17:11

25、45、55、75和94都大于12。因此第一个条件检查匹配,不需要进一步求值。你可以这样写它:

代码语言:javascript
运行
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45868369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档