• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Oracle的数据表中行转列与列转行的操作实例讲解

    行转列
    一张表

    查询结果为

    --行转列

    select years,(select amount from Tb_Amount as A where month=1 and A.years=Tb_Amount.years)as m1,
    (select amount from Tb_Amount as A where month=2 and A.years=Tb_Amount.years)as m2,
    (select amount from Tb_Amount as A where month=3 and A.years=Tb_Amount.years)as m3
    from Tb_Amount group by years
    

    或者为

    select years as 年份,
    sum(case when month='1' then amount end) as 一月,
     sum(case when month='2' then amount end) as 二月,
    sum(case when month='3' then amount end) as 三月
    from dbo.Tb_Amount group by years order by years desc
    

    2.人员信息表包括姓名 时代  金额

    显示行转列
    姓名     时代       金额

    姓名  年轻         中年       老年

    张丽 1000000.00 4000000.00    500000000.00

    孙子 2000000.00   12233335.00  4552220010.00

    select uname as 姓名,
    SUM(case when era='年轻' then amount end) as 年轻,
    SUM(case when era='中年' then amount end) as 中年,
    SUM(case when era='老年' then amount end) as 老年
    from Tb_People group by uname order by uname desc
    

     3.学生表 [Tb_Student]

    显示效果

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

    select sname as 姓名,
    max(case Subject when '语文' then grade else 0 end) as 语文,
    max(case Subject when '数学' then grade else 0 end) as 数学,
    max(case Subject when '英语' then grade else 0 end) as 英语
    from dbo.Tb_Student group by sname order by sname desc
    
    

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

    declare @sql varchar(8000)
    set @sql = 'select sname as ' + '姓名'
    select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then grade else 0 end) [' + Subject + ']'
    from (select distinct Subject from Tb_Student) as a
    set @sql = @sql + ' from Tb_Student group by sname order by sname desc'
    exec(@sql)
    
    

    oracle中Decode()函数使用 然后将这些累计求和(sum部分)

    select t.sname AS 姓名,
    sum(decode(t.subject,'语文',grade,null))语文 ,
    sum(decode(t.subject,'数学',grade,null)) 数学,
    sum(decode(t.subject,'英语',grade,null)) 英语
    from Tb_Student t group by sname order by sname desc
    


    列转行

    生成

    sql代码
    生成静态:

    select *
    from (select sname,[Course ] ='数学',[Score]=[数学] from Tb_students union all
    select sname,[Course]='英语',[Score]=[英语] from Tb_students union all
    select sname,[Course]='语文',[Score]=[语文] from Tb_students)t
    order by sname,case [Course] when '语文' then 1 when '数学' then 2 when '英语' then 3 end
    go
     --列转行的静态方案:UNPIVOT,sql2005及以后版本
     
     SELECT sname,Subject, grade
     from dbo.Tb_students
     unpivot(grade for Subject in([语文],[数学],[英语]))as up
     GO
     
     
     --列转行的动态方案:UNPIVOT,sql2005及以后版本
     --因为行是动态所以这里就从INFORMATION_SCHEMA.COLUMNS视图中获取列来构造行,同样也使用了XML处理。
     declare @s nvarchar(4000)
    select @s=isnull(@s+',','')+quotename(Name)
    from syscolumns where ID=object_id('Tb_students') and Name not in('sname')
    order by Colid
    exec('select sname,[Subject],[grade] from Tb_students unpivot ([grade] for [Subject] in('+@s+'))b')
    
    go
    select
      sname,[Subject],[grade]
    from
      Tb_students
    unpivot
      ([grade] for [Subject] in([数学],[英语],[语文]))b
    
    

    您可能感兴趣的文章:
    • Python SqlAlchemy动态添加数据表字段实例解析
    • java使用JDBC动态创建数据表及SQL预处理的方法
    • 如何将Oracle的一个大数据表快速迁移到 Sqlserver2008数据库(图文教程)
    • Angualrjs和bootstrap相结合实现数据表格table
    • bootstrap table 数据表格行内修改的实现代码
    • MySQL中大数据表增加字段的实现思路
    • mysql中数据库与数据表编码格式的查看、创建及修改
    • Android实现仿excel数据表格效果
    • MySQL清空数据表的方法实例与分析
    • jQuery EasyUI框架中的Datagrid数据表格组件结构详解
    • MySQL中复制数据表中的数据到新表中的操作教程
    • 详解数据库中跨库数据表的运算
    上一篇:Oracle的substr和instr函数简单用法
    下一篇:Oracle数据库执行脚本常用命令小结
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Oracle的数据表中行转列与列转行的操作实例讲解 Oracle,的,数据表,中行,转列,