`
409304740
  • 浏览: 21823 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 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 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 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 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 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 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb1

分享到:
评论

相关推荐

    oracle系列教程三+oracle复杂SQL语句.doc

    在处理行列转换时,Oracle提供了`PIVOT`和`UNPIVOT`功能,可以方便地实现数据的纵横转换。去重操作通常通过`DISTINCT`关键字实现,但在大量数据下,可能需要结合`GROUP BY`和`MIN/MAX`函数或者使用`ROW_NUMBER()`...

    C#面向对象设计模式纵横谈(7):Adapter 适配器模式(结构型模式) (Level 300)

    2. 数据库适配:连接不同类型的数据库,如SQL Server到Oracle的转换。 3. 网络协议转换:将不同网络协议的数据包转换为统一的格式。 总之,适配器模式是C#面向对象设计中一种强大的工具,它能帮助我们解决系统间的...

    绝对少见的手机WAP站点完整源码

    5. **样式表**:可能包含WCSS(Wireless CSS),用于控制WML页面的布局和样式。 **开发与调试技巧:** 1. **模拟器**:开发者通常会使用WAP模拟器,如Nokia WAP Toolkit,来测试WAP页面在不同手机上的显示效果。 ...

    ETL工具Beeload快速入门

    Beeload是一款由北京灵蜂纵横软件有限公司研发的数据整合软件,它集数据抽取、清洗、转换及装载于一体,旨在向数据分析平台提供高质量的数据,支持企业基于大数据中心的正确决策分析。Beeload的标准版快速入门内容...

    ETL工具Beeload技术白皮书

    Beeload是由北京灵蜂纵横软件有限公司研发的一款ETL工具,它集成了数据抽取、清洗、转换以及装载等功能。该工具不仅能够有效处理企业内部不同来源的数据,还提供了图形化的操作界面,使得用户能够更加直观地定义ETL...

    数据集成平台BeeDI6.0技术白皮书

    **产品概述**:**BeeDI**是一款由北京灵蜂纵横软件有限公司研发的数据整合软件,集成了数据抽取、清洗、转换及装载等功能,能够实现企业内部数据的标准化,并为决策分析提供高质量的数据支持。该软件不仅具备基础的...

    大数据决策分析平台建设方案2.0202306161532405475.pdf

    存储处理中心:底层数据仓库架构固定式数据展现源数据数据抽取转换数据仓库数据集市整合分析展现数据抽取数据转换数据加载数据质量管理ODS(操作数据存储)EDW(数据仓库)数据集市关系数据模型 多维数据模型主数据...

    著名十八哥PHP

    1. **变量**:PHP中的变量以$符号开头,无需预先声明类型,可动态转换。 2. **数据类型**:如整型、浮点型、字符串、布尔型、数组、对象、NULL等。 3. **流程控制**:包括条件语句(if...else,switch...case)和...

    该开一家面粉厂,还是做个包子铺? .doc

    6. 用户需求与产品策略:企业需要理解用户购买产品的真实目的,如微软的SQL Server是为了支持用户构建自己的应用系统,因此,产品公司需要通过市场和销售策略,将产品嵌入到用户的具体应用场景中。 7. 行业发展趋势...

    助理物流师(三级)-多项选择_17(精选试题).doc

    1. **Microsoft SQL Server**:微软公司的关系数据库管理系统,广泛应用于企业级应用。 2. **DB2**:IBM公司推出的一款高性能数据库系统,支持多种操作系统。 3. **Unix**:这里可能指的是运行在Unix操作系统上的...

Global site tag (gtag.js) - Google Analytics