前几天去面试了一家公司,面试官问了我一些技术问题,总体下来感觉回答得一半一半,想着下次再遇到同样的问题可别再放过了,于是决定开个面试题的分类进行一下复盘,将还记得的一些问题进行记录整理。
问题:
现在有个订单表,表中有个字段为订单状态status,数字类型,现需要统计一下每种订单状态下的总数,而其中订单状态为值2、3的总数按同一种状态算,写出SQL语句。
思路:
当面试官要出sql语句的时候我是信心满满的,毕竟刚上班那几年就是天天跟oracle打交道,还跟DB师父写写存储过程与调试、函数、视图啥的,可以说再复杂的查询基本都遇到过了,虽然已经那么多年不用oracle了,但sql语法基本都是相通的,毕竟也是一直在用mysql。刚开始以为只是问个简单的分组,考个group by用法,再上点难度也就加个having这样了,结果还要指定类型合并...还别说,因缺斯汀。于是脑袋回忆了一下,想到了case when函数,但具体用法是怎样的就给忘了差不多了,但我觉得能写出case when出来应该能得分了呀。。。。。。
答案:
现有order订单表数据如下如果按照要求,那么状态为0的有2条、1的有3条、2跟3合并后也有3条,那么SQL如下:
SELECT
CASE
WHEN STATUS IN
( 2, 3 ) THEN -- 状态为2跟3的都当2处理
2 ELSE STATUS
END AS status_group,
COUNT(*) AS count
FROM
`order`
GROUP BY status_group;
延伸:
此题还可以再根据其它条件进行延伸,比如按照时间create_time进行范围匹配,或者只要状态数量大于2的,亦或是根据状态值大小升序排列
SELECT
CASE
WHEN STATUS IN
( 2, 3 ) THEN
2 ELSE STATUS
END AS status_group,
COUNT(*) AS count
FROM
`order`
where create_time between '2025-08-11 00:00:00' and '2025-08-11 23:59:59'
GROUP BY status_group
having count >= 3
order by status_group;