纵表转横表(SQL)

/*

普通行列转换

(爱新觉罗.毓华 2007-11-18于海南三亚)

假设有张学生成绩表(tb)如下:

Name 
Subject Result

张三 语文  74

张三 数学  83

张三 物理  93

李四 语文  74

李四 数学  84

李四 物理  94

*/

-------------------------------------------------------------------------

/*

想变成 

姓名         语文        数学        物理          

---------- ----------- ----------- ----------- 

李四         74          84          94

张三         74          83          93

*/

create 
table 
tb

(

   
Name    
varchar
(10) ,

   
Subject 
varchar
(10) ,

   
Result  
int

)

insert 
into 
tb(
Name 
, Subject , Result) 
values
(
‘张三‘ 

‘语文‘ 
, 74)

insert 
into 
tb(
Name 
, Subject , Result) 
values
(
‘张三‘ 

‘数学‘ 
, 83)

insert 
into 
tb(
Name 
, Subject , Result) 
values
(
‘张三‘ 

‘物理‘ 
, 93)

insert 
into 
tb(
Name 
, Subject , Result) 
values
(
‘李四‘ 

‘语文‘ 
, 74)

insert 
into 
tb(
Name 
, Subject , Result) 
values
(
‘李四‘ 

‘数学‘ 
, 84)

insert 
into 
tb(
Name 
, Subject , Result) 
values
(
‘李四‘ 

‘物理‘ 
, 94)

go

--静态SQL,指subject只有语文、数学、物理这三门课程。

select 
name 
姓名,

  
max
(
case 
subject 
when 
‘语文‘ 
then 
result 
else 

end
) 语文,

  
max
(
case 
subject 
when 
‘数学‘ 
then 
result 
else 

end
) 数学,

  
max
(
case 
subject 
when 
‘物理‘ 
then 
result 
else 

end
) 物理

from 
tb

group 
by 
name

/*

姓名         语文        数学        物理          

---------- ----------- ----------- ----------- 

李四         74          84          94

张三         74          83          93

*/

--动态SQL,指subject不止语文、数学、物理这三门课程。

declare 
@sql 
varchar
(8000)

set 
@sql = 
‘select Name as ‘ 

‘姓名‘

select 
@sql = @sql + 
‘ , max(case Subject when ‘
‘‘ 
+ Subject + 
‘‘
‘ then Result else 0 end) [‘ 
+ Subject + 
‘]‘

from 
(
select 
distinct 
Subject 
from 
tb) 
as 
a

set 
@sql = @sql + 
‘ from tb group by name‘

exec
(@sql) 

/*

姓名         数学        物理        语文          

---------- ----------- ----------- ----------- 

李四         84          94          74

张三         83          93          74

*/

-------------------------------------------------------------------

/*加个平均分,总分

姓名         语文        数学        物理        平均分                总分          

---------- ----------- ----------- ----------- -------------------- ----------- 

李四         74          84          94          84.00                252

张三         74          83          93          83.33                250

*/

--静态SQL,指subject只有语文、数学、物理这三门课程。

select 
name 
姓名,

  
max
(
case 
subject 
when 
‘语文‘ 
then 
result 
else 

end
) 语文,

  
max
(
case 
subject 
when 
‘数学‘ 
then 
result 
else 

end
) 数学,

  
max
(
case 
subject 
when 
‘物理‘ 
then 
result 
else 

end
) 物理,

  
cast
(
avg
(result*1.0) 
as 
decimal
(18,2)) 平均分,

  
sum
(result) 总分

from 
tb

group 
by 
name

/*

姓名         语文        数学        物理        平均分                总分          

---------- ----------- ----------- ----------- -------------------- ----------- 

李四         74          84          94          84.00                252

张三         74          83          93          83.33                250

*/

--动态SQL,指subject不止语文、数学、物理这三门课程。

declare 
@sql1 
varchar
(8000)

set 
@sql1 = 
‘select Name as ‘ 

‘姓名‘

select 
@sql1 = @sql1 + 
‘ , max(case Subject when ‘
‘‘ 
+ Subject + 
‘‘
‘ then Result else 0 end) [‘ 
+ Subject + 
‘]‘

from 
(
select 
distinct 
Subject 
from 
tb) 
as 
a

set 
@sql1 = @sql1 + 
‘ , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name‘

exec
(@sql1) 

/*

姓名         数学        物理        语文        平均分                总分          

---------- ----------- ----------- ----------- -------------------- ----------- 

李四         84          94          74          84.00                252

张三         83          93          74          83.33                250

*/

drop 
table 
tb   

---------------------------------------------------------

---------------------------------------------------------

/*

如果上述两表互相换一下:即

姓名 语文 数学 物理

张三 74  83  93

李四 74  84  94

想变成 

Name       
Subject Result      

---------- ------- ----------- 

李四         语文      74

李四         数学      84

李四         物理      94

张三         语文      74

张三         数学      83

张三         物理      93

*/

create 
table 
tb1

(

   
姓名 
varchar
(10) ,

   
语文 
int 
,

   
数学 
int 
,

   
物理 
int

)

insert 
into 
tb1(姓名 , 语文 , 数学 , 物理) 
values
(
‘张三‘
,74,83,93)

insert 
into 
tb1(姓名 , 语文 , 数学 , 物理) 
values
(
‘李四‘
,74,84,94)

select 

from

(

  
select 
姓名 
as 
Name 
, Subject = 
‘语文‘ 
, Result = 语文 
from 
tb1 

  
union 
all

  
select 
姓名 
as 
Name 
, Subject = 
‘数学‘ 
, Result = 数学 
from 
tb1

  
union 
all

  
select 
姓名 
as 
Name 
, Subject = 
‘物理‘ 
, Result = 物理 
from 
tb1

) t

order 
by 
name 

case 
Subject 
when 
‘语文‘ 
then 

when 
‘数学‘ 
then 

when 
‘物理‘ 
then 

when 
‘总分‘ 
then 

end

--------------------------------------------------------------------

/*加个平均分,总分

Name       
Subject     Result               

---------- -------    -------------------- 

李四         语文      74.00

李四         数学      84.00

李四         物理      94.00

李四         平均分    84.00

李四         总分      252.00

张三         语文      74.00

张三         数学      83.00

张三         物理      93.00

张三         平均分    83.33

张三         总分      250.00

*/

select 

from

(

  
select 
姓名 
as 
Name 
, Subject = 
‘语文‘ 
, Result = 语文 
from 
tb1 

  
union 
all

  
select 
姓名 
as 
Name 
, Subject = 
‘数学‘ 
, Result = 数学 
from 
tb1

  
union 
all

  
select 
姓名 
as 
Name 
, Subject = 
‘物理‘ 
, Result = 物理 
from 
tb1

  
union 
all

  
select 
姓名 
as 
Name 
, Subject = 
‘平均分‘ 
, Result = 
cast
((语文 + 数学 + 物理)*1.0/3 
as 
decimal
(18,2)) 
from 
tb1

  
union 
all

  
select 
姓名 
as 
Name 
, Subject = 
‘总分‘ 
, Result = 语文 + 数学 + 物理 
from 
tb1

) t

order 
by 
name 

case 
Subject 
when 
‘语文‘ 
then 

when 
‘数学‘ 
then 

when 
‘物理‘ 
then 

when 
‘平均分‘ 
then 

when 
‘总分‘ 
then 

end

drop 
table 
tb1

时间: 2024-08-27 19:37:06

纵表转横表(SQL)的相关文章

SQL Server之纵表与横表互转

1,纵表转横表 纵表结构 Table_A: 转换后的结构: 纵表转横表的SQL示例: SELECT  Name ,        SUM(CASE WHEN Course = N'语文' THEN Grade                 ELSE 0            END) AS Chinese ,        SUM(CASE WHEN Course = N'数学' THEN Grade                 ELSE 0            END) AS Math

sql 语句纵表变横表

现把转换方法列举如下: 1.纵表转横表: 纵表结构 TableA Name Course Grade 张三 语文 75 张三 数学 80 张三 英语 90 李四 语文 95 李四 数学 55 横表结构 TableB Name 语文 数学 英语 张三 75 80 90 李四 95 55 0 方法一: select Name, sum(case Course when ‘语文‘ then Grade else 0 end) as 语文, sum(case Course when ‘数学‘ then

SQL纵表与横表互转

1.纵表转横表: 纵表结构:Table1 转换后的横表结构: Sql示例代码: select username, sum(case Course when '语文' then Grade else 0 end) as 语文, sum(case Course when '数学' then Grade else 0 end) as 数学, sum(case Course when '英语' then Grade else 0 end) as 英语 from Table1 group by usern

纵表与横表互转实例(转)

1.纵表转横表: 纵表结构:Table1 转换后的横表结构: Sql示例代码: 1 2 3 4 5 6 7 8 9 10 11 select username, sum(case Course when '语文' then Grade else 0 end) as 语文, sum(case Course when '数学' then Grade else 0 end) as 数学, sum(case Course when '英语' then Grade else 0 end) as 英语 fr

纵表与横表互转实例

1.纵表转横表: 纵表结构:Table1 转换后的横表结构: Sql示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 select username, sum(case Course when '语文' then Grade else 0 end) as 语文, sum(case Course when '数学' then Grade else 0 end) as 数学, sum(case Course when '英语' then Grade else 0 end) as 英语

sql_纵表变横表

method certificate value     getUserId 123 getUserid     startTime 123 22     endTime 123 33               如表所示,现在有一个需求,要算getUserId的执行时间,给一个思路,先查询出method=getUserID,和certificate,作为一个结果集,再查出来method=startTime的结果集,然后重新 select from这三个结果集r1,r2,r3, where R1

数据库之横表转纵表、纵表转横表

/*横表变纵表或纵表变横表 成绩表如下 Name Course Grade 张三 语文 95 张三 数学 90 张三 英语 89 李四 语文 92 李四 数学 88 李四 英语 97变成 姓名 语文 数学 英语 张三 95 90 89 李四 92 88 97 */ --纵表转横表 create table biao ( PName varchar(10), PCourse varchar (10), PGrade int ) go insert into biao values('张三','语文

sql实现纵表变横表

网上所有的纵横表转换都是千篇一律的,参考价值都不大,而且只适合那种数据量固定的学生成绩表的横纵转化,但是当真正遇到大数据量的批量转换的时候是行不通的,下面介绍一种相对灵活的大量数据的横纵表转换: 表结构: 如上图所示,其中index_id中以0结尾的表示的是服务名,以1结尾的表示设备rac名称,2结尾的表示的是设备状态. 下面我们需要将一组0,1,2结尾的分别展示成以服务名,设备rac名称,设备状态为表头的一行数据,多组0,1,2结尾的展示成多行数据. Sql执行如下: select index

Hadoop MapReduce纵表转横表

输入数据如下:以\t分隔 0-3岁育儿百科 书 23 0-5v液位传感器 5 0-5轴承 2 0-6个月奶粉 23 0-6个月奶粉c2c报告 23 0-6个月奶粉在线购物排名 23 0-6个月奶粉市场前景 23 0-6个月配方奶粉 23 0.001g电子天平 5 0.01t化铝炉 2 0.01吨熔铝合金炉 2 0.03吨化镁炉 25 0.03吨电磁炉 11 其中左侧是搜索词,右侧是类别,可看成是数据库中的纵表,现需要将输入转成横表,即 类名\t语句1\t语句2...,这样的格式. MapRedu