• 使用case when进行行转列


    我们在应用中通常会遇到需要行转列的情况。
     
    比如一个成绩表。表通常会这样设计:
    学生号 科目 成绩
     01      语文  80
     01      英语  90
     02      语文  60
    ........................
     
    然后可能客户需要的是这样的信息呈现:
    学生号    语文   英语   数学  ....
      01        80     90    
      02        60 
    .......................................
     
    这种情况我们就会需要行转列。
    使用case when来依条件分列是最简单的一种方法。
    1. select 学生号,  
    2. sum(case 科目 when '语文' then 成绩 end) as 语文,  
    3. sum(case 科目 when '数学' then 成绩 end) as 数学,  
    4. ......  
    5. from table  
    6. where ...  
    7. group by 学生号  
     
    然后当这种条件分支不清晰,转换后列数不固定的情况下呢?对照上面的例子来说就是,假设我并不知道学生学了哪些科目的时候应该怎么做?
    我们继续用case when,但是由于列的不固定,需要先根据条件分支产生的可能性来拼接一下语句再动态执行。直接上码看效果可能更清晰一点:
    1. declare @sql varchar(4000)  
    2. set @sql = 'select 学生号'  
    3.   
    4. select @sql = @sql + ',sum(case 科目 when '''+科目+''' then  成绩 end) ['+科目+']'  
    5. from (select distinct 科目 from table  ) as a  
    6. order by 科目  
    7.    
    8. select @sql = @sql+' from table  group by 学生号'  
    9.   
    10. --print @sql  
    11. exec(@sql) 
  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/gaotianle/p/1669812.html
Copyright © 2020-2023  润新知