cxl
Published on 2025-08-13 / 6 Visits
0
0

SQL查询-分类

前几天去面试了一家公司,面试官问了我一些技术问题,总体下来感觉回答得一半一半,想着下次再遇到同样的问题可别再放过了,于是决定开个面试题的分类进行一下复盘,将还记得的一些问题进行记录整理。

问题:

现在有个订单表,表中有个字段为订单状态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;


Comment