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) ‘1‘,
(SELECT MON1 FROM #T0 WHERE MON1=2) ‘2‘,
(SELECT MON1 FROM #T0 WHERE MON1=3) ‘3‘ 
时间: 2025-01-11 04:08:31

sql中的行转列和列转行的问题的相关文章

使用pivot和聚合函数将表中的行的值转为列产生新的表

原表格:V_ChannelReward结构为: select * from V_ChannelReward pivot (max(RewardSum) for RewardItem in ([星级奖励],[自建空充酬金],[首充酬金],[BOSS待办酬金],[激活酬金],[神州行上网套餐拓展酬金],[其他],[新增客户与裸机捆绑销售],[实名登记酬金],[宽带业务酬金],[2G渠道体系酬金],[3G渠道体系酬金],[数据业务酬金],[开户激励酬金],[开户基础酬金],[在网酬金],[维系酬金],

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

--判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER.sys.sysdatabases WHERE NAME = '库名') PRINT 'exists ' else PRINT 'not exists' -- 判断要创建的表名是否存在 IF EXISTS (Select * From sysObjects Where Name ='表名' And Type In ('S','U')) PRINT 'exists' ELSE PRINT 'not exists'

Python读写excel练习_去除excel中乱码行,并添加列

需求: 把app_student.xls里面的数据, 1.如果这一行数据里面有乱码(及包含?),那么就删掉 2.再加上一列,是否毕业 3.如果班级是天蝎座的话,毕业这一列写成毕业 4.其他班级的写成未毕业 原始数据: 实现: import xlrd,xlwt EXCEL_NAME = 'app_student.xls' def delete_messy_code(excel_name): #删除乱码 book = xlrd.open_workbook(excel_name) sheet = bo

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

开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来,也是磕磕碰碰的,虽然很能锻炼 SQL 功底,每次都要挣扎一番,溺水的感觉.记得SQL Server 2005 以后就有了 PIVOT 和 UNPIVOT 这两个函数,可以非常方便的实现行转列和列传行的操作,就不再那么挣扎了.后来,在一个 08 项目中,有一位新的女同事在改一个 ETL,发现 SSIS

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

说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 列换行语法 table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 1.2  行转列案例

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL,动态列字段: 方法三:使用PIVOT关系运算符,静态列字段: 方法四:使用PIVOT关系运算符,动态列字段: 扩展阅读一:参数化表名.分组列.行转列字段.字段值: 扩展阅读二:在前面的基础上加入条件过滤: 参考文献(References) 二.背景(Contexts) 其实行转列并不是一个什么新鲜的

sql学习系列-行转列问题 动态列展示

最近在做项目的过程需要做一个比较复杂的统计报表,涉及行转列问题. 首先看看报表的格式要求: 格式中要求按照日期的查询进行动态查询列标题,以及将数据进行按照日期进行列展示. 针对此要求,可以做一个简单的例子进行说明,可以进行两个步骤的操作: (1)先构造基本的数据: (2)对构造的数据进行行转列操作. create table test1(int test1,kqrq datetime,kqsj nvarchar(30));insert into test1(zh,kqrq,kqsj) value

经典SQL问题: 行转列&lt;转&gt;

转 经典SQL问题: 行转列 发表于5个月前(2015-09-19 17:49)   阅读(2905) | 评论(0) 20人收藏此文章, 我要收藏 赞0 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: ? 1 2 3 4 5 SELECTDISTINCT a.name, (SELE

经典SQL问题: 行转列

学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: SELECTDISTINCT a.name, (SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='语文')AS'语文', (SELECTscoreFROMgrade bWHEREa