行列互转

来源:互联网 发布:谷歌软件 编辑:程序博客网 时间:2024/05/01 22:58

行列互转


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)

原创粉丝点击