行列互转
1. 行转成列
一般使用SELECT/UNION法。SELECT表中的一列或几列,再配以常量,形成新表1的列;同样的方法形成新表2的列……最后将这些所有的新表使用UNION (ALL)连接起来。例如:有张学生成绩表如下:(表ta)
想变成(得到如下结果,表tb):
我们就可以使用下面的TSQL:
SELECT 姓名, 课程=’语文’, 分数=语文
FROM ta
UNION ALL
SELECT 姓名, 课程=’数学’, 分数=数学
FROM ta
UNION ALL
SELECT 姓名, 课程=’物理’, 分数=物理
FROM ta
2. 列转成行
一般使用GROUP/CASE法。首先对列中的数据进行分组,将需要变成一行的数据分在一组中,然后对这一组中的数据使用CASE再分成多列即可。同样使用上面的例子,如何从表tb转换成表ta?可以使用下面的TSQL:
SELECT 姓名, 语文=SUM(CASE WHEN 课程=’语文’ THEN 分数 END),
数学=SUM(CASE WHEN 课程=’数学’ THEN 分数 END),
物理=SUM(CASE WHEN 课程=’物理’ THEN 分数 END)
FROM tb
GROUP BY 姓名
再举一个比较常见的例子,分栏打印:将一个表分成多栏打印。还是借用上例中的表,将其输出成下面的格式(分成2栏,每栏4行):
我们该如何解决呢?
a. 首先我们得为表添加一个行字段ID,表tc
b. 根据ID来分组就可以了
SELECT 姓名1= MAX(CASE WHEN CEILING(ID/4.) = 1 THEN 姓名 END),
课程1= MAX(CASE WHEN CEILING(ID/4.) = 1 THEN 课程 END),
分数1= MAX(CASE WHEN CEILING(ID/4.) = 1 THEN 分数 END),
姓名2= MAX(CASE WHEN CEILING(ID/4.) = 2 THEN 姓名 END),
课程2= MAX(CASE WHEN CEILING(ID/4.) = 2 THEN 课程 END),
分数2= MAX(CASE WHEN CEILING(ID/4.) = 2 THEN 分数 END)
FROM tc
GROUP BY ID%4
ORDER BY MIN(ID)