zoukankan      html  css  js  c++  java
  • Sql 普通行列转换转

    create table tb  (     
    Name    varchar(10) ,     
    Subject varchar(10) ,     
    Result  int ,
    Mark varchar(10)
     )    
    insert into tb(Name , Subject , Result,Mark) values('张三' , '语文' , 74,'良好')  
    insert into tb(Name , Subject , Result,Mark) values('张三' , '数学' , 83,'好')  
    insert into tb(Name , Subject , Result,Mark) values('张三' , '物理' , 93,'很好')  
    insert into tb(Name , Subject , Result,Mark) values('李四' , '语文' , 74,'良好')  
    insert into tb(Name , Subject , Result,Mark) values('李四' , '数学' , 84,'好')  
    insert into tb(Name , Subject , Result,Mark) values('李四' , '物理' , 94,'非常好') 
    insert into tb(Name , Subject , Result,Mark) values('李1' , '语文' , 74,'良1好')  
    insert into tb(Name , Subject , Result,Mark) values('李1' , '数学' , 84,'好2')  
    insert into tb(Name , Subject , Result,Mark) values('李1' , '物理' , 94,'非常3好') 
    insert into tb(Name , Subject , Result,Mark) values('李1' , '生物' , 90,'非常好') 

    --获取评介(科目和用户) 函数

    CREATE FUNCTION getMark(@Group varchar(255),@Name varchar(255))
    RETURNS varchar(8000)
    AS
    BEGIN
    DECLARE @r varchar(8000)
    SET @r=''
    SELECT @r=Mark FROM tb WHERE Subject=@Group and name = @Name
    RETURN(@r)
    END
    GO   

    drop FUNCTION getMark 

    ---普通写法 

    select name 姓名,    
     max(case subject when '语文' then result else 0 end) 语文, dbo.getMark('语文',name) 语文mark,
     max(case subject when '数学' then result else 0 end) 数学, dbo.getMark('数学',name) 数学mark,   
     max(case subject when '物理' then result else 0 end) 物理, dbo.getMark('物理',name) 物理mark

    from tb  group by name   

    --动态写法 

    declare @sql varchar(8000)  
    set @sql = 'select Name as ' + '姓名'  
    select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'  
    +',dbo.getMark('''+subject+''',name) '+subject+'mark'
    from (select distinct Subject from tb) as a  
    set @sql = @sql + ' from tb group by name'  
    Print (@sql)
    exec(@sql) 

    --取平均分

    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  */ 
    --动态写法

     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 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name' 
     exec(@sql) 
  • 相关阅读:
    分布式任务调度 xxl-job
    【线上】 select * from xxoo where 1=1应用挂掉
    【死磕ES】七、基础检索
    【死磕ES】四、基本操作
    【死磕ES】三、基本概念
    【死磕ES】二、搭建环境
    Mac共享文件夹
    微信小程序下拉刷新,上拉加载
    微信小程序textarea输入框出现[object Object]
    微信小程序official-account的使用
  • 原文地址:https://www.cnblogs.com/Luouy/p/2647653.html
Copyright © 2011-2022 走看看