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) 
  • 相关阅读:
    bzoj2946 [Poi2000]公共串(SA,SAM)
    77 最长公共子序列
    C++ lower_bound 与 upper_bound 函数
    76 最长上升子序列
    75 寻找峰值
    C++标准输入问题
    74 第一个错误的代码版本
    73 前序遍历和中序遍历树构造二叉树
    72 中序遍历和后序遍历树构造二叉树
    71 二叉树的锯齿形层次遍历
  • 原文地址:https://www.cnblogs.com/Luouy/p/2647653.html
Copyright © 2011-2022 走看看