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

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    table 行转列的sql详解
    一、要求
    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
    至此,整个分析过程和结果就都出来了。
    初试写文章, 多包涵,指正。
    您可能感兴趣的文章:
    • mysql 行转列和列转行实例详解
    • sql语句实现行转列的3种方法实例
    • SQLServer行转列实现思路记录
    • MySQL存储过程中使用动态行转列
    • mssql 数据库表行转列,列转行终极方案
    • Sql Server 2000 行转列的实现(横排)
    • SQL查询语句行转列横向显示实例解析
    • sql动态行转列的两种方法
    • SQL行转列和列转行代码详解
    • SQL基础教程之行转列Pivot函数
    上一篇:常用SQL功能语句
    下一篇:三步堵死 SQL Server注入漏洞
  • 相关文章
  • 

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

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

    table 行转列的sql详解 table,行转列,的,sql,详解,