33 CASE WHEN的用法

33.1 CASE函数的类型

CASE函数具有两种格式,简单的CASE函数和CASE搜索函数。这两种方式,大部分情况下可以实现相同的功能。

 

33.2 简单CASE函数

语法:

CASE column
WHEN <condition> THEN value
WHEN <condition> THEN value
......
ELSE value END;

示例:

CASE sex
         WHEN '1' THEN ''
         WHEN2THEN ''
ELSE '其他' END;   

 

33.3 CASE搜索函数

语法:

CASE
WHEN <condition> [,<condition>] THEN value
WHEN <condition> [,<condition>] THEN value
......
ELSE value END;

示例:

CASE
WHEN sex='1' THEN ''
WHEN sex='2' THEN ''
ELSE '其他' END; 

简单CASE函数重在简介,但是它只适用于这种单字段的单值比较,而CASE搜索函数的有点在于适用于所有比较(包括多值比较)的情况。

例如:

CASE
WNEH sex='1' AND age>18 THEN '成年男性'
WHEN sex='2' AND age>18 THEN '成年女性'
ELSE '其他' END; 

注意:CASE函数只返回第一个符合条件的值,剩下的CASE部分将会被自动忽略。

比如,下面这段SQL,无法得到“第二类”这个结果:

CASE
WHEN Type IN ('a','b') THEN '第一类'
WHEN Type IN ('a') THEN '第二类'
ELSE '其他类' END;

 

33.4 CASE 行转列

CASE用的比较广泛的功能就是行转列,就是将记录行里的数据按条件转换成具体的列。看如下一个示例:

IF OBJECT_ID('Score') IS NOT NULL DROP TABLE Score
GO
CREATE TABLE Score
(姓名 NVARCHAR(10),课程 NVARCHAR(10),分数 INT);
INSERT INTO Score VALUES(N'张三',N'语文',74)
INSERT INTO Score VALUES(N'张三',N'数学',83)
INSERT INTO Score VALUES(N'张三',N'物理',93)
INSERT INTO Score VALUES(N'李四',N'语文',74)
INSERT INTO Score VALUES(N'李四',N'数学',84)
INSERT INTO Score VALUES(N'李四',N'物理',94)
GO
SELECT * FROM Score
GO

执行完后结果如图所示:

 

现在我们想实现这样的功能,就是将各学科作为单独的列来显示各个学生各科的成绩。我们可以对课程里的记录做如下的行列转换:

SELECT 姓名,
MAX(CASE 课程 WHEN N'语文' THEN 分数 ELSE 0 END) AS 语文,
MAX(CASE 课程 WHEN N'数学' THEN 分数 ELSE 0 END) AS 数学,
MAX(CASE 课程 WHEN N'物理' THEN 分数 ELSE 0 END) AS 物理
FROM Score
GROUP BY 姓名; 

执行结果如下:

 

 

33.5 行转列新方法

SQL Server 2005版之后有单独的行列转换功能PIVOT,以下查询同样可以得到上面的结果:

SELECT * FROM Score
PIVOT (MAX(分数) FOR 课程 IN (语文,数学,物理)) A

其中FOR后面的是我们即将进行行转列的列部分,IN里面的是我们行转列之后的列,MAX是聚合IN里面的内容,也可以是其他聚合函数:SUM、MIN、COUNT等。PIVOT写法比较固定,是CASE WHEN的一种简略写法。

 

33.6 批注

CASE是在日常工作中使用非常频繁的一个功能,可以很好的将我们需要的数据单独的显示在一列里面,有助于对数据有个比较清晰的掌握。

posted @ 2021-07-09 17:28  赵Gary  阅读(294)  评论(0)    收藏  举报