zoukankan      html  css  js  c++  java
  • sqlserver行列转换

    • sqlserver行转列
    --创建行转列表及插入数据
    create table tb_RowConvertToColumn
    (
       username nvarchar(100) null,
       course nvarchar(100) null,
       score numeric(10,2) null
    )
    insert into tb_RowConvertToColumn(username,course,score) values('张三','语文',82)
    insert into tb_RowConvertToColumn(username,course,score) values('张三','数学',85)
    insert into tb_RowConvertToColumn(username,course,score) values('张三','外语',90)
    insert into tb_RowConvertToColumn(username,course,score) values('李四','语文',86)
    insert into tb_RowConvertToColumn(username,course,score) values('李四','数学',82)
    insert into tb_RowConvertToColumn(username,course,score) values('李四','外语',92)
    insert into tb_RowConvertToColumn(username,course,score) values('王五','语文',82)
    insert into tb_RowConvertToColumn(username,course,score) values('王五','数学',94)
    insert into tb_RowConvertToColumn(username,course,score) values('王五','外语',82)
    
    --1.静态sql行转列,该sql指定了转换的列头
    select username 姓名,
           MAX(case course when '语文' then score else 0 end) 语文,
           MAX(case course when '数学' then score else 0 end) 数学,
           MAX(case course when '外语' then score else 0 end) 外语
    from tb_RowConvertToColumn
    group by username
    order by username
    /*
    姓名    语文    数学    外语
    李四    86.00    82.00    92.00
    王五    82.00    94.00    82.00
    张三    82.00    85.00    90.00
    */
    
    
    --2.静态sql行转列,该sql指定了转换的列头,该语句必须sqlserver2005及以上版本才能使用
    select username 姓名,语文,数学,外语 from tb_RowConvertToColumn pivot(max(score) for course in(语文,数学,外语)) a
    /*
    姓名    语文    数学    外语
    李四    86.00    82.00    92.00
    王五    82.00    94.00    82.00
    张三    82.00    85.00    90.00
    */
    select * from tb_RowConvertToColumn pivot(max(score)for course in (语文,数学,外语)) a
    /*
    username    语文    数学    外语
    李四    86.00    82.00    92.00
    王五    82.00    94.00    82.00
    张三    82.00    85.00    90.00
    */
    
    
    --3.动态sql行转列,自动生成转换的列
    declare @sql nvarchar(2000)
    select distinct course into #tb_group from tb_RowConvertToColumn order by course desc--表头及排序
    select @sql=ISNULL(@sql+',','')+'MAX(case course when '''+course+''' then score else 0 end) ['+course+']'
     from #tb_group
    set @sql='select username 姓名,'+@sql
            +' from tb_RowConvertToColumn a'
            +' group by username'
    exec(@sql)
    drop table #tb_group
    /*
    姓名    语文    外语    数学
    李四    86.00    92.00    82.00
    王五    82.00    82.00    94.00
    张三    82.00    90.00    85.00
    */
    
    
    --4.动态sql行转列,自动生成转换的列,该语句必须sqlserver2005及以上版本才能使用
    declare @sql nvarchar(2000)
    select @sql=ISNULL(@sql+',','')+course
    from tb_RowConvertToColumn
    group by course
    set @sql='select * from tb_RowConvertToColumn pivot (max(score) for course in ('+@sql+')) a'
    exec(@sql)
    /*
    username    数学    外语    语文
    李四    82.00    92.00    86.00
    王五    94.00    82.00    82.00
    张三    85.00    90.00    82.00
    */
    • sqlserver列转行
    --创建列转行表及插入数据
    create table tb_ColumnConvertToRow
    (
       [姓名] nvarchar(100) null,
       [语文] nvarchar(100) null,
       [数学] nvarchar(100) null,
       [外语] nvarchar(100) null
    )
    
    insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values('李四',82,92,86)
    insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values('王五',94,82,82)
    insert into tb_ColumnConvertToRow(姓名,语文,数学,外语) values('张三',85,90,82)
    
    --1.静态sql列转行,当列头较少时使用
    select * from 
    (
       select 姓名,课程='语文',分数=语文 from tb_ColumnConvertToRow
       union all
       select 姓名,课程='数学',分数=数学 from tb_ColumnConvertToRow
       union all 
       select 姓名,课程='外语',分数=外语 from tb_ColumnConvertToRow
    ) a
    /*
    姓名    课程    分数
    李四    语文    82
    王五    语文    94
    张三    语文    85
    李四    数学    92
    王五    数学    82
    张三    数学    90
    李四    外语    86
    王五    外语    82
    张三    外语    82
    */
    
    
    --2.静态sql列转行,当列头较少时使用,该语句必须sqlserver2005及以上版本才能使用
    select 姓名,课程,分数 from tb_ColumnConvertToRow unpivot(分数 for 课程 in (语文,数学,外语)) a
    /*
    姓名    课程    分数
    李四    语文    82
    李四    数学    92
    李四    外语    86
    王五    语文    94
    王五    数学    82
    王五    外语    82
    张三    语文    85
    张三    数学    90
    张三    外语    82
    */
  • 相关阅读:
    vs报错“以下文件中的行尾不一致,是否将行尾标准化”
    redis配置
    C#中保留两位小数但不四舍五入的最优做法
    jMeter 监控cpu、内存
    project 2010 使用技巧
    JMeter2.13 连接 sql server
    JMeter2.13进行压力测试
    freefilesync 7 使用
    cmd中无法运行svn命令
    MongoDB 3 + Windows 7 X64安装及配置
  • 原文地址:https://www.cnblogs.com/wanghonghu/p/5631662.html
Copyright © 2011-2022 走看看