SQL行列转换

转载 2008年09月29日 07:52:00

--行转列问题
--建立測試環境
Create Table TEST
(DATES Varchar(6),
 EMPNO Varchar(5),
 STYPE Varchar(1),
 AMOUNT Int)
--插入數據
Insert TEST Select '200605',  '02436',     'A',        5
Union All Select '200605',  '02436',     'B',        3
Union All Select '200605',  '02436',     'C',        3
Union All Select '200605',  '02436',     'D',        2
Union All Select '200605',  '02436',     'E',        9
Union All Select '200605',  '02436',     'F',        7
Union All Select '200605',  '02436',     'G',        6
Union All Select '200605',  '02438',     'A',        7
Union All Select '200605',  '02438',     'B',        8
Union All Select '200605',  '02438',     'C',        0
Union All Select '200605',  '02438',     'D',        3
Union All Select '200605',  '02438',     'E',        4
Union All Select '200605',  '02438',     'F',        5
Union All Select '200605',  '02438',     'G',        1
GO
--測試
--如果STYPE固定,可以這麼寫
Select
DATES,
EMPNO,
SUM(Case STYPE When 'A' Then AMOUNT Else 0 End) As A,
SUM(Case STYPE When 'B' Then AMOUNT Else 0 End) As B,
SUM(Case STYPE When 'C' Then AMOUNT Else 0 End) As C,
SUM(Case STYPE When 'D' Then AMOUNT Else 0 End) As D,
SUM(Case STYPE When 'E' Then AMOUNT Else 0 End) As E,
SUM(Case STYPE When 'F' Then AMOUNT Else 0 End) As F,
SUM(Case STYPE When 'G' Then AMOUNT Else 0 End) As G
From TEST
Group By DATES,EMPNO
Order By DATES,EMPNO

--如果STYPE不固定,用動態語句
Declare @S Varchar(1000)
Set @S=''
Select @S=@S+',SUM(Case STYPE When '''+STYPE+''' Then AMOUNT Else 0 End) As '+STYPE From (Select Distinct STYPE From TEST) A Order By STYPE
Set @S='Select DATES,EMPNO'+@S+' From TEST Group By DATES,EMPNO Order By DATES,EMPNO'
EXEC(@S)
GO
--如果被转置的是数字类型的话,应用下列语句
DECLARE @S VARCHAR(1000)
SET @S='SELECT DATES,EMPNO '
SELECT @S=@S+',['+STYPE+']=SUM(CASE WHEN STYPE='''+STYPE+''' THEN AMOUNT ELSE 0 END)'
FROM (Select Distinct STYPE From TEST) A Order By STYPE
SET @S=@S+' FROM TEST GROUP BY DATES,EMPNO'
EXEC(@S) 

如果是列转行的话直接Union All就可以了

例如 :

city style      color 46 48 50 52
长沙 S6MF01002   152  1  2  2 1
长沙 S6MF01002   201  1  2  2 1
上面到下面的样子
city   style          color size qty
长沙 S6MF01002       152    46  1
长沙 S6MF01002       152    48   2
长沙 S6MF01002       152    50   2
长沙 S6MF01002       152    52  1
长沙 S6MF01002       201    46  1
长沙 S6MF01002       201    48  2
长沙 S6MF01002       201    50  2
长沙 S6MF01002       201    52  1

Select City,Style,Color,[46] From Test
Union all
Select City,Style,Color,[48] From Test
Union all
Select City,Style,Color,[50] From Test
Union all
Select City,Style,Color,[52] From Test

就可以了

[数据库] SQL查询语句表行列转换及一行数据转换成两列

本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法、子查询的应用、decode函数的用法。希望文章对你有所帮助~ 1.创建数据库表及插入数据 2.子查询统计不同...
  • Eastmount
  • Eastmount
  • 2016年01月22日 05:03
  • 15859

锋利的SQL-SQL Server的表旋转(行列转换)

所谓表旋转,就是将表的行转换为列,或是将表的列转换为行,这是从SQL Server 2005开始提供的新技术。因此,如果希望使用此功能,需要将数据库的兼容级别设置为90。表旋转在某些方面也是解决了表的...
  • zhanghongju
  • zhanghongju
  • 2014年08月17日 18:37
  • 4754

数据库中的行列转换(横竖转换)

(竖的数据表变横的数据表)例子: SELECT NAME, SUM(DECODE(course,'JDBC',gradem,0)) JDBC, SUM(DECODE(course,'Hibernate...
  • secretkevin
  • secretkevin
  • 2016年01月15日 11:41
  • 4516

hive行列转换总结

1、单列转换成多行 比如: pageid  paged page1   a,b,c 要转换成 page1 a page1 b page1 c select pageid,p from test lat...
  • u011750989
  • u011750989
  • 2013年10月12日 16:22
  • 3482

SQL Server 2008 行列转换操作

行转列操作,主要用到了Pivot Pivot语法结构: Pivot (A) for B in(C) A:Max(Total),表示要显示的合计值, B:Monthly,原始数据的列头,就是要把...
  • mangkata
  • mangkata
  • 2017年03月10日 10:24
  • 129

简化实现动态行列转置的SQL

动态行列转换的计算在实际业务中很常见,网上各类技术论坛上都有讨论,比如下面这些问题: http://www.iteye.com/problems/87788 http://bbs.csdn.net...
  • u012388497
  • u012388497
  • 2015年08月21日 09:07
  • 2064

oracle行列转换函数的使用

oracle 10g wmsys.wm_concat行列转换函数的使用: 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行,接下来上例子...
  • HUXU981598436
  • HUXU981598436
  • 2014年07月26日 23:25
  • 1628

T-SQL查询:行列转换简单实例

--★转换结果如上图 --创建测试标 CREATE TABLE [成绩表]( [编号] [int] IDENTITY(1,1) NOT NULL, [姓名] [varchar](50) NU...
  • kk185800961
  • kk185800961
  • 2013年01月07日 18:11
  • 2085

SQL语句行列转换(附带数据库、表、视图操作)

本来只是想解决怎么把数据的行和列进行转换的,但最近觉得一些数据库SQL语句的操作,很久没用了,有点陌生。所以也就随笔记录一些简单但很基本的操作。 我的数据库是MSSQL2005. 第一部分主要的操...
  • beijing20110905
  • beijing20110905
  • 2016年07月07日 13:50
  • 220

Oracle行列互换

近几天一直在弄Oracle-SQL的问题,涉及到了一些平时没有用到的东西,也因此而在这里郁闷了好久。现在问题得到了解决虽说不算完美。但是还是和大家一起分享一下。 行列转换之一:sum(case ...
  • dreamthen
  • dreamthen
  • 2013年06月26日 11:32
  • 5634
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL行列转换
举报原因:
原因补充:

(最多只允许输入30个字)