[SQL] CASE...WHEN 进行排序和分组

SQL CASE…WHEN 进行排序和分组

基本排序

置顶单行数据并将其他数据排序

select * 
    from tb_schedule_zy 
order by 
    (case schedule_id when '1' then 0 else 1 end) asc,
    create_time desc,
    schedule_name desc

置顶id为1的数据,并将其他数据优先以时间倒叙排序,如果时间一样,按照名称倒序排序

  • ordey by 后面根据 ‘,’ 区分多个条件,并由左到右进行优先级排序

分组条件判断统计

  • case ... when ...测试:

根据字段分组统计


SELECT 

        CASE WHEN dev_group_id <= 10 THEN '1'
             WHEN dev_group_id > 10 AND dev_group_id <= 20  THEN '2'
             WHEN dev_group_id > 20 AND dev_group_id <= 30  THEN '3'
             WHEN dev_group_id > 30 AND dev_group_id <= 40 THEN '4'
        ELSE NULL END scount,
        COUNT(*)    
FROM tb_auth_detail_all
GROUP BY
       CASE WHEN dev_group_id <= 10 THEN '1'
             WHEN dev_group_id > 10 AND dev_group_id <= 20  THEN '2'
             WHEN dev_group_id > 20 AND dev_group_id <= 30  THEN '3'
             WHEN dev_group_id > 30 AND dev_group_id <= 40 THEN '4'
        ELSE NULL END;

-- 输出
scount count
NULL    160187
2   9859
4   9983
3   9996
1   9975


select  count(*) from tb_auth_detail_all where dev_group_id <= 10 

-- 输出
count
9975

总结:

- Case具有两种格式。简单Case函数和Case搜索函数。
-- 简单Case函数
CASE sex
         WHEN '1' THEN '男'
         WHEN '2' THEN '女'
ELSE '其他' END
-- Case搜索函数
CASE WHEN sex = '1' THEN '男'
         WHEN sex = '2' THEN '女'
ELSE '其他' END
- Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略
-- 比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
         WHEN col_1 IN ('a')       THEN '第二类'
ELSE'其他' END
- Case函数用途

分组(分析)、条件过滤执行语句、排序置顶数据、简化sql、检查表数据是否一致等,详见【1】

REFRENCES

  1. SQL中的case when then else end用法
上一篇:mysql中select 值复杂逻辑处理


下一篇:oracel根据条件不同,统计数据sql