工作中经常使用的一个关键字:CASE。说起CASE还得从我刚进入第一家公司的面试说起。
第一家公司是我第一次面试公司,当时还是有点小紧张。在和HR沟通之后,就开始做三道面试题,给我影响深刻的是第一道和第三道都是用的CASE,因为之前对CASE比较了解,笔试也就顺利通过了。
CASE是一个标量表达式,它是基于条件逻辑返回一个值。只能用在标量表达式中(如SELECT,WHERE,HAVING和ORDER BY子句等)
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的独到用处,就是行转列功能。看如下的一个示例:
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb
GO
CREATE TABLE tb(姓名 NVARCHAR(10),课程 NVARCHAR(10),分数 INT)
INSERT INTO tb VALUES (N'张三',N'语文',74)
INSERT INTO tb VALUES (N'张三',N'数学',83)
INSERT INTO tb VALUES (N'张三',N'物理',93)
INSERT INTO tb VALUES (N'李四',N'语文',74)
INSERT INTO VALUES (N'李四',N'数学',84)
INSERT INTO VALUES (N'李四',N'物理',94)GO
SELECT * FROM tb
GO
执行完成后的结果如图:
开始进行行列转换:
SELECT 姓名,
MAX(CASE 课程 WHEN N'语文' THEN 分数 ELSE 0 END) 语文,
MAX(CASE 课程 WHEN N'数学' THEN 分数 ELSE 0 END) 数学,
MAX(CASE 课程 WHEN N'物理' THEN 分数 ELSE 0 END) 物理
FROM tb
GROUP BY 姓名
执行结果如下:
这样就很好的完成了行列的转换了,当然这只是一个比较简单的例子,SQL Server 2005版之后有单独的行列转换功能PIOVT,以下查询同样可以得到上面的结果:
SELECT * FROM tb PIVOT( MAX(分数) FOR 课程 IN (语文,数学,物理))a
这个功能特别适合那时候业务系的一些数据的提取,我在工作上用的比较多,这里分享给大家。