码迷,mamicode.com
首页 > 数据库 > 详细

sql中的行转列和列转行的问题

时间:2016-05-13 12:40:00      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

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 

 

sql中的行转列和列转行的问题

标签:

原文地址:http://www.cnblogs.com/mc67/p/5487289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!