我们在应用中通常会遇到需要行转列的情况。
比如一个成绩表。表通常会这样设计:
学生号 科目 成绩
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 学生号

select 学生号, sum(case 科目 when '语文' then 成绩 end) as 语文, sum(case 科目 when '数学' then 成绩 end) as 数学, ...... from table where ... group by 学生号

然后当这种条件分支不清晰,转换后列数不固定的情况下呢?对照上面的例子来说就是,假设我并不知道学生学了哪些科目的时候应该怎么做?
我们继续用case when,但是由于列的不固定,需要先根据条件分支产生的可能性来拼接一下语句再动态执行。直接上码看效果可能更清晰一点:
  1. declare @sql varchar(4000)
  2. set @sql = 'select 学生号'
  3. select @sql = @sql + ',sum(case 科目 when '''+科目+''' then  成绩 end) ['+科目+']'
  4. from (select distinct 科目 from table  ) as a
  5. order by 科目
  6. select @sql = @sql+' from table  group by 学生号'
  7. --print @sql
  8. exec(@sql)

转载于:https://www.cnblogs.com/gaotianle/archive/2010/02/20/1669812.html

使用case when进行行转列相关推荐

  1. HiveSQL一天一个小技巧:如何借助于str_to_map进行行转列

    目录 0 需求描述 1 需求分析 2 小 结 0 需求描述 有如下表格 partner label value 001 原始证件号 9111030275820228X7 001 统一社会信用代码 91 ...

  2. Oracle对查询结果使用Pivot函数来进行行转列

    Pivot使用注意事项 pivot是oracle11版本中新增函数 用于行列转换 使用 借用图片:源地址 https://www.cnblogs.com/xiao02fang/p/9705609.ht ...

  3. 使用LISTAGG函数进行行转列

    语法: LISTAGG(exp1, exp2) 集函数 首先根据 sql 语句中的 group by 分组(如果 没有指定分组则所有结果集为一组),然后在组内按照 WITHIN GROUP 中的 OR ...

  4. R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法、data.table、dplyr等方案

    R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法.data.table.dplyr等方案 目录

  5. HTML中利用堆栈方式对Table进行行排序

    <!--   all rights by Lonsan on 2005  email:Lonsan21@163.com --> <html> <head> < ...

  6. Hive _偏门常用查询函数(一)附带实例(空字段赋值、 CASE WHEN、行转列)

    空字段赋值 函数说明 NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with).它的功能是如果string1为NULL,则NVL函数返回replace_wit ...

  7. 使用EasyUI的Datagrid的Editor进行行编辑,Enter回车结束编辑,并开启新的一行。

    //新增数据 function add() { if (Index == undefined) { row = { move_date: '', start_time: '', end_time: ' ...

  8. c# 导入Excel 存到DataTable并进行行转列操作及合并DataTable相同行的值

    由于公司需要就进行研究下并转化为代码: 原Excel数据 配送センターコード 店コード 总计 L W H 9999 0951 8 55 45 60 9999 0952 8 55 45 60 9999 ...

  9. datagrid编辑单元格回车换行_使用EasyUI的Datagrid的Editor进行行编辑,Enter回车结束编辑,并开启新的一行。...

    //新增数据 function add() { if (Index == undefined) { row = { move_date: '', start_time: '', end_time: ' ...

最新文章

  1. 把ct图像像素值转化为_数字图像概论与基础
  2. python队列线程池_实例详解:python高级编程之消息队列(Queue)与进程池(Pool)
  3. MySQL 索引条件下推 Index Condition Pushdown
  4. UA MATH566 统计理论 截断数据
  5. MSP432P401R TI Drivers 库函数学习笔记(七)I2C驱动OLED屏幕
  6. 使用开源工具ELK可视化 Azure NSG日志
  7. 项目总结-vue分页组件集成
  8. 48.本地Hyper-V虚拟机的异地(Azure)容灾(下)
  9. gps高斯utm_高斯-克吕格投影与UTM投影
  10. 我本人常去的一些技术性网站!!(不定期更新)
  11. 【裴礼文数学分析】例1.1.3
  12. FFMpeg无损合并视频的多种方法
  13. matlab里方框一个叉号,Word输入×叉号和方框打叉方法
  14. c语言中 静态变量的默认值为,C中静态变量的默认值
  15. 大厂如何开发和部署前端代码?淘宝8年案例解读
  16. Excel 数据解析异常
  17. cdr文字内容显示不出来_电脑装的字体cdr里面不显示怎么办
  18. android 蓝牙触控笔,FiftyThree 53 Paper pencil 电容笔蓝牙触控笔 上手试用
  19. 23 种设计模式的#羞羞#解释,听说能看懂的人都是泡妞高手
  20. XStream的简单使用

热门文章

  1. 搭建SSH框架之一(资料准备)
  2. “傻子”阿甘的大智慧
  3. Spring内核研究-通过工厂注入
  4. gcc 提供的原子操作
  5. ionic ajax 跨域,解决 ionic 中的 CORS(跨域) 问题
  6. python线性回归实例_python 线性回归示例
  7. 浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源
  8. Linux 基础知识(十)DNS服务器主从复制,子域授权
  9. 详细理解java Hibernate 或 JPA的级联操作
  10. linux基础lvm