MS SQL中的行轉列

create   table  tb
(
    LocTion 
nvarchar ( 20 ),
    
work   nvarchar ( 40 ),
    
money   int ,
    time 
int ,
    age 
int
)

insert  tb  select   ' 广州 ' ,                    ' 程序员 '       ,  1000  ,           5           ,    22  
insert  tb  select   ' 广州 '  ,                   ' 教师 '        ,     1700 ,            10       ,      22  
insert  tb  select   ' 广州 '   ,                  ' 警察 '       ,      1300  ,           15      ,         22  
insert  tb  select   ' 广州 '    ,                 ' 警察 '      ,       800    ,           5     ,        22  
insert  tb  select   ' 上海 '     ,                ' 程序员 '   ,      1600      ,       5       ,        21  
insert  tb  select   ' 上海 '      ,               ' 司机 '    ,         1200     ,        15   ,          21  
insert  tb  select   ' 北京 '       ,              ' 程序员 ' ,        1400        ,     5     ,          29

declare   @sql   nvarchar ( 4000 )
set   @sql = ''
select   @sql = @sql + ' ,sum(case when time= ' + cast (time  as   varchar ) + '  then money else 0 end) as [ ' + cast (time  as   varchar ) + ' ] '
from  ( select   distinct  time  from  tb) a

exec  ( ' select LocTion,Work ' + @sql + ' ,max(age) as age from tb group by LocTion,Work order by LocTion,Work ' )

drop   table  tb

/*
LocTion              Work            5           10          15          age         
-------------------- ---------------- ----------- ----------- ----------- ----------- 
北京                   程序员              1400        0           0           29
广州                   程序员              1000        0           0           22
广州                   教师                0           1700        0           22
广州                   警察                800         0           1300        22
上海                   程序员              1600        0           0           21
上海                   司机                0           0           1200        21

*/

ContractedBlock.gif ExpandedBlockStart.gif Code
  1 /*
  2 普通行列转换
  3 (爱新觉罗.毓华 2007-11-18于海南三亚)
  4 
  5 假设有张学生成绩表(tb)如下:
  6 Name Subject Result
  7 张三 语文  74
  8 张三 数学  83
  9 张三 物理  93
 10 李四 语文  74
 11 李四 数学  84
 12 李四 物理  94
 13 */
 14 
 15 -------------------------------------------------------------------------
 16 /*
 17 想变成 
 18 姓名         语文        数学        物理          
 19 ---------- ----------- ----------- ----------- 
 20 李四         74          84          94
 21 张三         74          83          93
 22 */
 23 
 24 create table tb
 25 (
 26    Name    varchar(10) ,
 27    Subject varchar(10) ,
 28    Result  int
 29 )
 30 
 31 insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
 32 insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
 33 insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
 34 insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
 35 insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
 36 insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
 37 go
 38 
 39 --静态SQL,指subject只有语文、数学、物理这三门课程。
 40 select name 姓名,
 41   max(case subject when '语文' then result else 0 end) 语文,
 42   max(case subject when '数学' then result else 0 end) 数学,
 43   max(case subject when '物理' then result else 0 end) 物理
 44 from tb
 45 group by name
 46 /*
 47 姓名         语文        数学        物理          
 48 ---------- ----------- ----------- ----------- 
 49 李四         74          84          94
 50 张三         74          83          93
 51 */
 52 
 53 --动态SQL,指subject不止语文、数学、物理这三门课程。
 54 declare @sql varchar(8000)
 55 set @sql = 'select Name as ' + '姓名'
 56 select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
 57 from (select distinct Subject from tb) as a
 58 set @sql = @sql + ' from tb group by name'
 59 exec(@sql
 60 /*
 61 姓名         数学        物理        语文          
 62 ---------- ----------- ----------- ----------- 
 63 李四         84          94          74
 64 张三         83          93          74
 65 */
 66 
 67 -------------------------------------------------------------------
 68 /*加个平均分,总分
 69 姓名         语文        数学        物理        平均分                总分          
 70 ---------- ----------- ----------- ----------- -------------------- ----------- 
 71 李四         74          84          94          84.00                252
 72 张三         74          83          93          83.33                250
 73 */
 74 
 75 --静态SQL,指subject只有语文、数学、物理这三门课程。
 76 select name 姓名,
 77   max(case subject when '语文' then result else 0 end) 语文,
 78   max(case subject when '数学' then result else 0 end) 数学,
 79   max(case subject when '物理' then result else 0 end) 物理,
 80   cast(avg(result*1.0as decimal(18,2)) 平均分,
 81   sum(result) 总分
 82 from tb
 83 group by name
 84 /*
 85 姓名         语文        数学        物理        平均分                总分          
 86 ---------- ----------- ----------- ----------- -------------------- ----------- 
 87 李四         74          84          94          84.00                252
 88 张三         74          83          93          83.33                250
 89 */
 90 
 91 --动态SQL,指subject不止语文、数学、物理这三门课程。
 92 declare @sql1 varchar(8000)
 93 set @sql1 = 'select Name as ' + '姓名'
 94 select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
 95 from (select distinct Subject from tb) as a
 96 set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
 97 exec(@sql1
 98 /*
 99 姓名         数学        物理        语文        平均分                总分          
100 ---------- ----------- ----------- ----------- -------------------- ----------- 
101 李四         84          94          74          84.00                252
102 张三         83          93          74          83.33                250
103 */
104 
105 drop table tb    
106 
107 ---------------------------------------------------------
108 ---------------------------------------------------------
109 /*
110 如果上述两表互相换一下:即
111 
112 姓名 语文 数学 物理
113 张三 74  83  93
114 李四 74  84  94
115 
116 想变成 
117 Name       Subject Result      
118 ---------- ------- ----------- 
119 李四         语文      74
120 李四         数学      84
121 李四         物理      94
122 张三         语文      74
123 张三         数学      83
124 张三         物理      93
125 */
126 
127 create table tb1
128 (
129    姓名 varchar(10) ,
130    语文 int ,
131    数学 int ,
132    物理 int
133 )
134 
135 insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
136 insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)
137 
138 select * from
139 (
140   select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
141   union all
142   select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
143   union all
144   select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
145 ) t
146 order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end
147 
148 --------------------------------------------------------------------
149 /*加个平均分,总分
150 Name       Subject     Result               
151 ---------- -------    -------------------- 
152 李四         语文      74.00
153 李四         数学      84.00
154 李四         物理      94.00
155 李四         平均分    84.00
156 李四         总分      252.00
157 张三         语文      74.00
158 张三         数学      83.00
159 张三         物理      93.00
160 张三         平均分    83.33
161 张三         总分      250.00
162 */
163 
164 select * from
165 (
166   select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
167   union all
168   select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
169   union all
170   select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
171   union all
172   select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
173   union all
174   select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
175 ) t
176 order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end
177 
178 drop table tb1

create   table  t
(
    LocTion 
nvarchar ( 20 ),
    
work   nvarchar ( 40 ),
    
money   int ,
    time 
int ,
    age 
int
)

insert  t  select   ' 广州 ' ,                    ' 程序员 '       ,  1000  ,           5           ,    22  
insert  t  select   ' 广州 '  ,                   ' 教师 '        ,     1700 ,            10       ,      22  
insert  t  select   ' 广州 '   ,                  ' 警察 '       ,      1300  ,           15      ,         22  
insert  t  select   ' 广州 '    ,                 ' 警察 '      ,       800    ,           5     ,        22  
insert  t  select   ' 上海 '     ,                ' 程序员 '   ,      1600      ,       5       ,        21  
insert  t  select   ' 上海 '      ,               ' 司机 '    ,         1200     ,        15   ,          21  
insert  t  select   ' 北京 '       ,              ' 程序员 ' ,        1400        ,     5     ,          29

go


declare   @s   nvarchar ( 4000 )
set   @s = ' select LocTion,work '
select   @s = @s + ' , ' + quotename (time) + ' =sum(case when time= ' + rtrim (time)  + '  then money else 0 end) '
from  t  group   by  time

exec  ( @s + ' ,age from t group by LocTion,work,age ' )
-- 生成的语句:
select  LocTion, work , [ 5 ] = sum ( case   when  time = 5   then   money   else   0   end ), [ 10 ] = sum ( case   when  time = 10   then   money   else   0   end ), [ 15 ] = sum ( case   when  time = 15   then   money   else   0   end ),age  from  t  group   by  LocTion, work ,age
LocTion              
work                                       5             10            15           age         
-- ------------------ ---------------------------------------- ----------- ----------- ----------- ----------- 
北京                   程序员                                       1400          0             0             29
广州                   程序员                                      
1000          0             0             22
广州                   教师                                       
0             1700          0             22
广州                   警察                                       
800           0             1300          22
上海                   程序员                                      
1600          0             0             21
上海                   司机                                       
0             0             1200          21

create   table  t
(
    LocTion 
nvarchar ( 20 ),
    
work   nvarchar ( 40 ),
    
money   int ,
    time 
int ,
    age 
int
)

insert  t  select   ' 广州 ' ,                    ' 程序员 '       ,  1000  ,           5           ,    22  
insert  t  select   ' 广州 '  ,                   ' 教师 '        ,     1700 ,            10       ,      22  
insert  t  select   ' 广州 '   ,                  ' 警察 '       ,      1300  ,           15      ,         22  
insert  t  select   ' 广州 '    ,                 ' 警察 '      ,       800    ,           5     ,        22  
insert  t  select   ' 上海 '     ,                ' 程序员 '   ,      1600      ,       5       ,        21  
insert  t  select   ' 上海 '      ,               ' 司机 '    ,         1200     ,        15   ,          21  
insert  t  select   ' 北京 '       ,              ' 程序员 ' ,        1400        ,     5     ,          29

go

select  
    LocTion,
    
work ,
    
[ 5 ] = sum ( case   when  time = 5   then   money   else   0   end ),
    
[ 10 ] = sum ( case   when  time = 10   then   money   else   0   end ),
    
[ 15 ] = sum ( case   when  time = 15   then   money   else   0   end ),
    age ,
    row
= identity ( int , 1 , 1
    
into  ## -- 生成临时表
from  
    t 
group   by  LocTion, work ,age   order   by  age % 2   asc , age  asc


select  
    
[ LocTion ] = case   when  row = ( select   min (row)  from  ##  where   [ LocTion ] = a. [ LocTion ] then   [ LocTion ]   else   '' end ,
    
[ work ] , [ 5 ] , [ 10 ] , [ 15 ] ,age
from  
    ## a

-- drop table ##



LocTion              
work                                       5             10            15           age         
-- ------------------ ---------------------------------------- ----------- ----------- ----------- ----------- 
广州                   程序员                                       1000          0             0             22
                     教师                                       
0             1700          0             22
                     警察                                       
800           0             1300          22
上海                   程序员                                      
1600          0             0             21
                     司机                                       
0             0             1200          21
北京                   程序员                                      
1400          0             0             29

(所影响的行数为 
6  行)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值