SQL语法-CASE用法

CASE基础语法

CASE 列名 WHEN 条件 THEN 结果 ELSE 其他结果 END 别名

# 简单CASE WHEN
CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END 
CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END
CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END

# 合并多个条件
case SCORE                                             
	when 'A' then '优'
    when 'B' then '良'
    when 'C' then '中'
    else '不及格' end 成绩
from score_table;

CASE WHEN 题目

1)按条件分类-树节点

问题:给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id 。

表格tree:
+----+------+
| id | p_id |
+----+------+
| 1  | null |
| 2  | 1    |
| 3  | 1    |
| 4  | 2    |
| 5  | 2    |
+----+------+

要求输出表格:
+----+------+
| id | Type |
+----+------+
| 1  | Root |
| 2  | Inner|
| 3  | Leaf |
| 4  | Leaf |
| 5  | Leaf |
+----+------+

答案代码:
select id,
case when p_id is null then 'Root'
when id in (select p_id from tree) then 'Inner'
else 'Leaf' end type
from tree

2)多列比较-三角形

问题:假设表 triangle 保存了所有三条线段的三元组 x, y, z ,你能帮 Tim 写一个查询语句,来判断每个三元组是否可以组成一个三角形吗?

| x  | y  | z  |
|----|----|----|
| 13 | 15 | 30 |
| 10 | 20 | 15 |

注:任意两边之和 大于 第三边

解法一:
SELECT x,y,z,
    CASE
        WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes'
        ELSE 'No'
    END AS 'triangle'
FROM triangle;

解法二(使用IF):
SELECT
	*, IF(`x` + `y` > `z` AND `x` + `z` > `y` AND `y` + `z` > `x`, 'Yes', 'No') AS triangle
FROM
	triangle;

3) 按条件统计 SUM(case())

问题:现老师要统计班中,有多少男同学,多少女同学,并统计男同学中有几人及格,女同学中有几人及格,要求用一个SQL输出结果。
表结构如下:其中STU_SEX字段,0表示男生,1表示女生。

STU_CODE	STU_NAME	STU_SEX	STU_SCORE
XM	小明	0	88
XL	小磊	0	55
XF	小峰	0	45
XH	小红	1	66
XN	晓妮	1	77
XY	小伊	1	99

解法:
SELECT 
	SUM (CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
	SUM (CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
	SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
FROM THTF_STUDENTS

输出结果如下:

MALE_COUNTFEMALE_COUNTMALE_PASSFEMALE_PASS
3313

4)行转列

有能耗表如下:其中,E_TYPE表示能耗类型,0表示水耗,1表示电耗,2表示热耗

E_CODE	E_VALUE 	E_TYPE
北京	28.50	0
北京	23.51	1
北京	28.12	2
北京	12.30	0
北京	15.46	1
上海	18.88	0
上海	16.66	1
上海	19.99	0
上海	10.05	0


SELECT 
	E_CODE,
	SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,--水耗
	SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,--电耗
	SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY--热耗
FROM THTF_ENERGY_TEST
GROUP BY E_CODE

结果输出:

E_CODEWATER_ENERGYELE_ENERGYHEAT_ENERGY
北京40.8038.9728.12
上海48.9216.660

链接:https://leetcode-cn.com/problems/triangle-judgement/solution/pan-duan-san-jiao-xing-by-leetcode/
链接:https://leetcode-cn.com/problems/triangle-judgement/solution/610-pan-duan-san-jiao-xing-by-eric-345/

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页