行列互转
来源:互联网 发布:谷歌软件 编辑:程序博客网 时间: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)
- SQL 行列互转
- 行列互转
- 行列互转整理
- 行列互转
- 行列互转
- 行列互转
- 行列互转
- SQL行列互转
- SQL行列互转
- sqlserver 行列互转
- SQL行列互转
- SQl行列互转
- sql行列互转(转帖)
- 行列互转_整理
- (备忘)Oracle 行列互转
- 单标行列互转
- 行列互转_整理贴[转]
- CSDN SQL Area --行列互转...
- ajaxPro
- strftime 函数
- shell输出a-z,A-Z,0-9
- Linux网络协议栈(三)——网络设备(1)
- 图片上传预览
- 行列互转
- SQL Server 全文检索初探
- 关于提高自己JAVA水平的十大技术
- oracle函数
- CListCtrl实现拖拽效果
- csdn网摘工具
- c#窗体间的那点事1
- Linux网络协议栈(三)——网络设备(2)
- 开源界的5大开源许可协议