sql中的行转列和列转行的问题
sql中的行转列和列转行的问题
这是一个常见的问题,也是一个考的问题
1.行转列的问题
简单实例
- CREATE TABLE #T
- (
- MON1 INT,
- MON2 INT,
- MON3 INT
- )
- GO
- INSERT INTO #T VALUES(1,2,3)
- GO
- SELECT * FROM #T
- --行转列;(union all)
- SELECT MON1 FROM #T
- UNION ALL
- SELECT MON2 FROM #T
- UNION ALL
- SELECT MON3 FROM #T
- GO
- --最后的优化
- SELECT * FROM (
- SELECT MON1 FROM #T
- UNION ALL
- SELECT MON2 FROM #T
- UNION ALL
- SELECT MON3 FROM #T
- ) T
较为复杂的实例
具体实现代码
- --创建表
- GO
- CREATE TABLE #T1(
- NAME NVARCHAR(100),
- CHINESE NVARCHAR(100),
- MATH NVARCHAR(100),
- ENGLISH NVARCHAR(100)
- )
- --插入模拟数据
- SELECT * FROM #T1
- GO
- INSERT INTO #T1 VALUES('张三',80,90,90)
- INSERT INTO #T1 VALUES('李四',47,78,null)
- INSERT INTO #T1 VALUES('王五',null,90,null)
- GO
- SELECT * FROM #T1
- --具体代码实现
- GO
- SELECT * FROM (
- SELECT NAME AS '姓名','语文' AS '科目',CHINESE AS '成绩' FROM #T1
- UNION ALL
- SELECT NAME AS '姓名','数学' AS '科目',MATH AS '成绩' FROM #T1
- UNION ALL
- SELECT NAME AS '姓名','英语' AS '科目',ENGLISH AS '成绩' FROM #T1
- ) T
- order by T.姓名
解决方法二
- --列转行的静态方案:UNPIVOT,sql2005及以后版本
- --方法二;这个方法 会自动去除值为 NULL 的值
- SELECT NAME,OBJ,GRADE
- FROM #T1
- UNPIVOT(GRADE FOR OBJ IN (CHINESE,MATH,ENGLISH)) AS UP
网络上 还流行这个方法
- INFORMATION_SCHEMA.COLUMNS视图中获取列来构造行,同样也使用了XML处理。
2 列转行
简单实例
- CREATE TABLE #T0
- (
- MON1 INT
- )
- INSERT INTO #T0 VALUES(1)
- INSERT INTO #T0 VALUES(2)
- INSERT INTO #T0 VALUES(3)
- SELECT * FROM #T0
- --方法一 仅仅限制于 数据不重复的情况下
- SELECT
- (SELECT MON1 FROM #T0 WHERE MON1=1) '',
- (SELECT MON1 FROM #T0 WHERE MON1=2) '',
- (SELECT MON1 FROM #T0 WHERE MON1=3) ''
更多较好的实例:
http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
sql中的行转列和列转行的问题的更多相关文章
- Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform
Expression构建DataTable to Entity 映射委托 1 namespace Echofool.Utility.Common { 2 using System; 3 using ...
- Sql中判断"库、表、列,视图,存储过程"是否存在
--判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER.sys.sysdatabases WHERE NAME = '库名') PRINT 'exists ' else ...
- sql server 多行数据合并成一列
首先是源数据: ),cip.CheckIn_StartTime, )),cip.CheckIn_EndTime, )),cip.Rental_Price)) as content from Check ...
- SQL中 根据行号设置每行数据的排序数值
根据行号自动把当前行号插入到某列中 实现排序 update tempTable set DisplayOrder = right( CAST(rownum as NVARCHAR),5) from( ...
- Spark SQL中列转行(UNPIVOT)的两种方法
行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 本文链接:https: ...
- 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作
开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...
- SQL 行转列和列转行
SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...
- (转载)重温SQL——行转列,列转行
原文地址:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通 ...
随机推荐
- 【BZOJ】1008: [HNOI2008]越狱(快速幂)
http://www.lydsy.com/JudgeOnline/problem.php?id=1008 刚开始看不会做啊,以为是dp,但是数据太大!!!所以一定有log的算法或者O1的算法,,,,还 ...
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
一.CPU 使用proc文件系统,"proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口.用户和应用程序可以通过proc得 ...
- log4j与commons-logging,slf4j的关系
前面有一篇日志中简单的介绍了 log4j,同时也介绍了它与commons-logging的关系,但是突然冒出来一个slf4j,并且slf4j有取代commons-logging的趋势,所以,我们可以推 ...
- Nginx在Windows系统和Linux系统下的重启
一.Windows系统下重启nginx 1.杀掉nginx进程 tskill nginx echo 已终止所有ginx进程 2.启动nginx cd f:\nginx- nginx.exe ...
- Java主要有那几种文件类型,各自作用
java提供了两类数据类型:基本类型,引用类型. 1.基本类型包括:boolean ,byte,char,int,short,float,long,double,值得注意的是:在原始数据类型中,除了b ...
- Spark - RDD(弹性分布式数据集)
org.apache.spark.rddRDDabstract class RDD[T] extends Serializable with Logging A Resilient Distribut ...
- PreparedStatement与Statement的区别
PreparedStatement与statement的区别 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statement 对象 ...
- Scrum会议5(Beta版本)
组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...
- jquery click点击事件重复执行多次
$("button[name^='privateBtn']").click(function(){ alert('demo'); //接触绑定.避免重复执行 $("but ...
- 郎科U208(主控 PS2251-50 HYNIX H27UCG8T2MYR)量产还原
6年前的一个U盘 记得还是参加某会议送的,当时做了量产 多做了一个光盘区,现在用不着了 想还原成普通U盘 忘了方法. 可见笔记的重要性 Chipgenius看了主控 PS2251-50 芯片是海力士 ...