SQL中如何统计含最终“其他”条件的多CASE语句计数?
如何添加"其余情况"的订单计数?
要统计第四个"其余情况"的订单数量,你只需要在原查询里新增一条COUNT(CASE ...)语句即可。另外先提两个原语句里的小细节修正,避免后续报错或统计不准确:
- 带空格的列名
Device Type,在多数SQL数据库中需要用反引号(如MySQL)或方括号(如SQL Server)包裹,否则会被识别为两个关键字导致语法错误; - 原语句中
Price IN (2,3)只能匹配价格恰好等于2或3的订单,但需求是"$2-$3之间",如果价格是小数(比如2.5)就会被漏掉,改用Price BETWEEN 2 AND 3能覆盖所有2到3之间的数值(包含边界值)。
下面是修正后包含第四个统计条件的完整查询:
SELECT -- 条件1:Device Type为"A"且Price<$2 COUNT(CASE WHEN `Device Type` = 'A' AND Price < 2 THEN 1 END) AS count_a_under_2, -- 条件2:Device Type为"A"且Price在$2-$3之间 COUNT(CASE WHEN `Device Type` = 'A' AND Price BETWEEN 2 AND 3 THEN 1 END) AS count_a_2_to_3, -- 条件3:Device Type为"B"且Price>$3 COUNT(CASE WHEN `Device Type` = 'B' AND Price > 3 THEN 1 END) AS count_b_over_3, -- 条件4:其余所有情况 COUNT(CASE WHEN NOT ( (`Device Type` = 'A' AND Price < 2) OR (`Device Type` = 'A' AND Price BETWEEN 2 AND 3) OR (`Device Type` = 'B' AND Price > 3) ) THEN 1 END) AS count_others FROM `table`;
关于第四个条件的逻辑说明
COUNT()函数会自动忽略NULL值,所以当CASE语句的条件不满足时,会返回NULL,不会被计入统计。上面的写法用NOT排除了前三个条件的所有情况,剩下的就是需要统计的"其余情况"。
你也可以用更简洁的方式写第四个CASE:
COUNT(CASE WHEN (`Device Type` = 'A' AND Price < 2) OR (`Device Type` = 'A' AND Price BETWEEN 2 AND 3) OR (`Device Type` = 'B' AND Price > 3) THEN NULL ELSE 1 END) AS count_others
两种写法的效果完全一致,选你觉得更容易理解的即可。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

