A. sql 行列转换
行列转换等经典SQL语句
1.--行列转换
原表: 姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 物理 82
李四 英语 90
李四 政治 70
王五 英语 90
转换后的表: 姓名 数学 物理 英语 语文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
张三 90 85 0 80 0
实例:
create table cj --创建表cj
(
ID Int IDENTITY (1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定义ID为表cj的主键
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '张三','语文',80 union all
Select '张三','数学',90 union all
Select '张三','物理',85 union all
Select '李四','语文',85 union all
Select '李四','物理',82 union all
Select '李四','英语',90 union all
Select '李四','政治',70 union all
Select '王五','英语',90
--行列转换
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名称都列举出来
Select @sql = @sql+' from cj group by name'
Exec (@sql)
2. 行列转换--合并
原表: 班级 学号
1 1
1 2
1 3
2 1
2 2
3 1
转换后的表: 班级 学号
1 1,2,3
2 1,2
3 1
实例:
Create table ClassNo --创建表ClassNo
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Class Varchar(50), --班级列
Number Varchar(50), --学号列
Primary Key(ID) --定义ID为表ClassNo的主键
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1
创建一个合并的函数
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End
--调用自定义函数得到结果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo
3:列转行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定义ID为表ColumnToRow的主键
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12
Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的长度就是这个字符串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因为它会把ID这一列的值也算进去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')
B. Sql 行列转换
select * from
(
select CarNo as CarNo, Subject = '停车费' , Result = 停车费 from tb1
union all
select CarNo as CarNo, Subject = '路桥费' , Result = 路桥费 from tb1
union all
select CarNo as CarNo, Subject = '燃油费' , Result = 燃油费 from tb1
) t
order by name , case Subject when '停车费' then 1 when '路桥费' then 2 when '燃油费' then 3 when '金额' then 4 end
C. 如何用SQL语句达到行列转置的效果求答案
有专门的行专列内置函数,oracle的叫pivot,你可以研究下。可以实现你要的效果
D. 写sql,怎么将查询结果的行列转换呀
有意思的问题 给出一个参考的URL: 假设你表是这样的结构部件 入库日期 入库数量 A 1/1 10 A 1/1 5 A 1/2 10 B 1/5 10 其实就是两种方法,假设你的数据库是11以前的,只能先定义好查哪天到哪天 然后那么 selct 部件, sum( decode(入库日期=1号,入库数量,0), sum( decode(入库日期=2号,入库数量,0), 以此类推 from 入库表 group BY 部件(原理上就是将不是这天的变成0,再合计)要是Oracle数据库是11的话,就简单了,直接pivot搞定 pivot语法就不说了,网上一堆一堆的 ~
E. sql动态实现行列转换
题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
F. sql 行列转置
看看这个吧
SQLServer中(行列转换)行转列及列转行且加平均值及汇总值
G. sql行列转置语句
declare @sql varchar(2000)
set @sql=''
select @sql=@sql+',max(case B when '+cast(B as varchar(10))+' then c end) ['+cast(B as varchar(10))+']'
from (Select distinct B from TB) x
set @sql='select A'+@sql+' from (select A,B,count(distinct C) c from tb
group by A,B) v
group by a'
exec(@sql)
H. SQL SERVER行列转置
select '语文' 课程,avg(chinese) 平均分 from 表
union
select '数学' 课程,avg(math) 平均分 from 表
union
select '英语' 课程,avg(english) 平均分 from 表
I. SQL行列转换
1> create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
2> Insert tb
3> Select '张三','语文',60 union all
4> Select '张三','数学',70 union all
5> Select '张三','英语',80 union all
6> Select '张三','物理',90 union all
7> Select '李四','语文',65 union all
8> Select '李四','数学',75 union all
9> Select '李四','英语',85 union all
10> Select '李四','物理',95
11> go
(8 行受影响)
1>
2> SELECT
3> *
4> FROM
5> tb
6> PIVOT(
7> SUM([分数])
8> FOR [课程] IN ([语文],[数学] )
9> ) tmp
10> go
姓名 语文 数学
---------- ----------- -----------
李四 65 75
张三 60 70
(2 行受影响)
好像没有办法,课程名字必须写在 SQL 里面。
FOR [课程] IN ([语文],[数学] )
J. 在excel中用sql语句实现行列转置
在excel中,使用SQL太麻烦了。
有专门的功能,叫透视表,可以试一下。