当前位置:  数据库>sqlserver

table 行转列的sql详解

    来源: 互联网  发布时间:2014-09-05

    本文导语:  一、要求 1 创建数据表 CREATE TABLE [dbo].[StuScore]( [stuid] [int] NOT NULL, [subject] [nvarchar](30) NULL, [score] [decimal](5, 1) NULL ) 2 插入测试数据 stuid subject score 3 chinese 76.0 3 math 73.0 4 chinese 82.0 5 chinese 66.0 5 math 93.0 6 chinese 67.0 7 math 83.0 8 chinese 77....

一、要求
1 创建数据表
CREATE TABLE [dbo].[StuScore](
[stuid] [int] NOT NULL,
[subject] [nvarchar](30) NULL,
[score] [decimal](5, 1) NULL
)
2 插入测试数据
stuid subject score
3 chinese 76.0
3 math 73.0
4 chinese 82.0
5 chinese 66.0
5 math 93.0
6 chinese 67.0
7 math 83.0
8 chinese 77.0
8 math 84.0
3 行转列后的结果
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
二 、分析
1 行转列,一个重点就是怎么样知道有多少列,怎么样创建这些列?我们可以先把这个问题搁置,而假设这些列是已知的。 例如示例数据中,可以先假设subject的数据[chinese,math]是已知的,这样问题就简化了许多
2 当已知了chinese,math后,我们至少要先得到转换后的tabel结构
如下;
select stuid, 0 as chinese, 0 as math from dbo.StuScore
结果如下
stuid chinese math
3 0 0
3 0 0
4 0 0
5 0 0
5 0 0
6 0 0
7 0 0
8 0 0
8 0 0
3 接着就需要往这个数据集中去填充chinese, math的数据
select stuid,
case subject when 'chinese' then score else 0 end as chinese,
case subject when 'math' then score else 0 end as math
from dbo.StuScore
结果如下:
stuid chinese math
3 76.0 0.0
3 0.0 73.0
4 82.0 0.0
5 66.0 0.0
5 0.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 0.0
8 0.0 84.0
4 细心的读者会发现步骤3中的结果与我们想要的已经非常接近了,只需再做一个sum()处理,就OK了
select stuid,
sum(case subject when 'chinese' then score else 0 end ) as chinese,
sum(case subject when 'math' then score else 0 end ) as math
from dbo.StuScore group by stuid
得到的正是我们想要的结果
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
是不是现在就已经完成了呢?答案是否定的。前面我们已经说过,是为了简化问题,在假设已经知道了subject数据的情况下,这么处理的,实际上subject的数据是可变的,未知的,接下来就是要解决这个问题了
5 要获取subject的数据其实很简单
select distinct subject from dbo.StuScore
获取以后怎样得到case subject when 'chinese' then score else 0 end 这种语句?
可以根据subject的值去动态的组sql语句
看下面的一段代码
declare @sql varchar(2000)
set @sql=''
select @sql =@sql+ ',case subject when '''+subject+''' then 1 else 0 end as ' + subject
from (select distinct subject from dbo.StuScore) as sub
print @sql
message打印的信息如下:
,case subject when 'chinese' then 1 else 0 end as chinese,case subject when 'math' then 1 else 0 end as math
6 最后我们就需要将前面步骤综合起来,得到最终的sql
declare @sql varchar(2000)
set @sql='select stuid'
select @sql =@sql+ ',sum(case subject when '''+subject+''' then score else 0 end) as ' + subject
from (select distinct subject from dbo.StuScore) as sub
set @sql=@sql + ' from dbo.StuScore group by stuid'
exec(@sql)
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
至此,整个分析过程和结果就都出来了。
初试写文章, 多包涵,指正。

    
 
 

您可能感兴趣的文章:

  • ThinkPHP CURD方法之table方法教程详解
  • ThinkPHP CURD方法之table方法详解
  • 探讨Mysql中OPTIMIZE TABLE的作用详解
  • MySQL性能优化配置参数之thread_cache和table_cache详解
  • java命名空间javax.sql.rowset.spi类syncprovider的类成员方法: datasource_table_lock定义及介绍
  • 在SQL Server中查询资料库的TABLE数量与名称的sql语句
  • Sql学习第一天——SQL 将变量定义为Table类型(虚拟表)
  • sql语句怎么写:将table中字段name='string1'的记录都改为name='string2'的记录
  • sql代码:select database select all table
  • 为什么这条语句“select * from table1 group by field1,field2 ”在 Access 97下面的SQL编辑器里面 运行不了!!有谁知道什么原因??
  • 自动清理 MS SQL Server Table Collation 的问题
  • UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists
  • SQL Server Table中XML列的操作代码
  • 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.swing.table类jtableheader的类成员方法: table定义及介绍
  • mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)
  • java命名空间javax.swing.plaf.synth类region的类成员方法: table定义及介绍
  • 我在table中选中一行删除后,数据库中是删除了,但我的table中这一行还显示,我怎么让他不显示??
  • java命名空间javax.accessibility类accessiblerole的类成员方法: table定义及介绍
  • 用new JTalbe(10, 20)创建了一个table,如何设置该table列(column)的宽度
  • java命名空间javax.swing.plaf.basic类basictableui的类成员方法: table定义及介绍
  • 請問在一個分成上下兩個框架的整個頁面中,上面框架是包含一個form的form.jsp頁面,下面框架則是包含table的另一table.jsp頁面,當按下fo
  • java命名空间javax.swing.text.html类html.tag的类成员方法: table定义及介绍
  • GTK编程~我在hpanel里加了一个4*1table~里面放了四个button~怎么设置可以使四个button之间有一定的距离~设置table 的边框么?请教下怎么让app的界面固定~不能最大化
  • java命名空间javax.swing.table类jtableheader的类成员方法: gettable定义及介绍
  • Table Library
  • java命名空间javax.swing.plaf.synth类region的类成员方法: table_header定义及介绍
  • 困惑很久的问题,一个实体BEAN只能对应一个TABLE吗?如果有几百个TABLE,难道要写几百个实体BEAN?
  • java命名空间javax.swing.table类jtableheader的类成员方法: getcolumnmodel定义及介绍
  • IP Tables State
  • java命名空间javax.swing.table类tablecolumn的类成员方法: identifier定义及介绍
  • 关于定死table宽度
  • java命名空间javax.accessibility类accessiblecontext的类成员方法: accessible_table_model_changed定义及介绍
  • 运行insmod ip_tables后,reboot后又无效了?
  • java命名空间javax.accessibility类accessiblecontext的类成员方法: accessible_table_summary_changed定义及介绍
  • Table Scroller


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3