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中的行转列和列转行的问题的更多相关文章

  1. 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 ...

  2. Sql中判断"库、表、列,视图,存储过程"是否存在

    --判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER.sys.sysdatabases WHERE NAME = '库名') PRINT 'exists ' else ...

  3. sql server 多行数据合并成一列

    首先是源数据: ),cip.CheckIn_StartTime, )),cip.CheckIn_EndTime, )),cip.Rental_Price)) as content from Check ...

  4. SQL中 根据行号设置每行数据的排序数值

    根据行号自动把当前行号插入到某列中 实现排序 update tempTable set DisplayOrder = right( CAST(rownum as NVARCHAR),5) from(  ...

  5. Spark SQL中列转行(UNPIVOT)的两种方法

    行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 本文链接:https: ...

  6. 微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作

    开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来, ...

  7. 做图表统计你需要掌握SQL Server 行转列和列转行

    说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...

  8. SQL 行转列和列转行

    SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...

  9. (转载)重温SQL——行转列,列转行

    原文地址:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通 ...

随机推荐

  1. HttpClient_用Apache HttpClient实现URL重定向

    很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置.原因可能是多方面的,比如域名转发.URL缩写.隐私保护.在同一网站维持相似的域名等.本文讲述怎样使用Apache HTTPC ...

  2. Graph database_neo4j 底层存储结构分析(6)

    3.6  Node 数据存储 neo4j 中, Node 的存储是由 NodeStore 和 ArrayPropertyStore 2中类型配合来完成的. node 的label 内容是存在Array ...

  3. 【C语言】15-预处理指令1-宏定义

    预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2 ...

  4. hdu City Game

    做这题之前建议做一下hdu1506题,两道题是极度相似的题,不同的是这个要处理的是m行,所以可以用一个dp[][]数组存储矩形的高度,之后就变成hdu1506了. 例如测试样例: 0 1 1 1 1 ...

  5. XSS的高级利用部分总结 -蠕虫

    XSS的高级利用部分总结 -蠕虫,HTTP-only,AJAX本地文件操作,镜象网页本帖最后由 racle 于 2009-5-30 09:19 编辑 XSS的高级利用总结 -蠕虫,HTTPONLY,A ...

  6. in_array 的第三个参数strict设置为 true

    var_dump(in_array(0, array('s' )); 这句话的结果是bool(true). 因为in_array会将0 和's' 进行比较,0是number类型,'s'是string类 ...

  7. Wps 方框里面加勾

    1.选择插入-->选择符号 2.选择更多 3.选择 字体Wingdings 然后下拉到最后.就看到了

  8. Web 在线文件管理器学习笔记与总结(3)创建文件

    ① 创建文件 a. 文件名的合法性:不能包含 \/:*"<>| 等特殊字符 b. 检测当前目录下是否存在同名文件,如果存在提示请重命名后创建,如果不存在则直接创建 index.p ...

  9. Rails--content_for和yield

    --使用: (1)layout中使用<%=yield(:js)%> (2)html中使用<% content_for :js do %>[XXX]<% end %>

  10. Rails--export csv

    --controller def export_agent_impressions export_start_time = Time.parse(params[:es_time]) + 7.hours ...