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. Python小例子

    import urllib.request as request import urllib.parse as parse import string print(""" ...

  2. 使用distinct出现的一个问题

    如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中. 错误的写法:select distinct top 100  userphone  from m ...

  3. 【转载】Erlang 中 link 和 monitor 的区别

    Link and Monitor differences 原文地址 Introduction link/1 and monitor/2 are 2 different ways of notifyin ...

  4. QImage Color Convert to Gray 转为灰度图

    在Qt中,我们有时需要把QImage类的彩色图片转为灰度图,一开始我想的是用QImage的成员函数convertToFormat(),但是试了好多参数,返现转化的图片都有问题,不是我们想要的灰度图,如 ...

  5. 新鲜出炉的30个精美的 jQuery & CSS3 效果【附演示和教程】

    新鲜出炉的30个精美的 jQuery & CSS3 效果[附演示和教程]   作为最流行的 JavaScript 开发框架,jQuery 在现在的 Web 开发项目中扮演着重要角色,它简化了 ...

  6. Linux kernel perf_swevent_init Local root Exploit

    64位上编译 另外修改了原Exploit的一个错误 第76行 把     uint64_t *p = (void *) ¤t[i]; 改成       uint64_t *p = (void *) & ...

  7. 《GK101任意波发生器》升级固件发布(版本:1.0.2build306)

    一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build306 编译日期:2014-09-24 ====================================== 二. ...

  8. [转]理解OAuth 2.0

    作者: 阮一峰 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释, ...

  9. Python浮点数控制小数精度

    将精度高的浮点数转换成精度低的浮点数. 1.round()内置方法 这个是使用最多的,刚看了round()的使用解释,也不是很容易懂.round()不是简单的四舍五入的处理方式. For the bu ...

  10. Anti-pattern

    https://en.wikipedia.org/wiki/Anti-pattern https://zh.wikipedia.org/wiki/反面模式 An anti-pattern is a c ...