题:

或请参考1179. 重新格式化部门表 - 力扣(LeetCode)https://leetcode-cn.com/problems/reformat-department-table/
进行实操

  • 列转行
CASE expr1 WHEN expr2 THEN expr3 ELSE expr4 END

行中字段expr1是expr2取expr3否则取expr4

根据题意

CASE month WHEN 'jan' THEN revenue ELSE null END

当字段month是‘jan’时,取字段revenue的值,否则取null

整个题目代码为

select id,
sum(CASE month WHEN 'jan' THEN revenue ELSE null END) AS 'jan_revenue',
sum(CASE month WHEN 'Feb' THEN revenue ELSE null END) AS 'Feb_revenue',
sum(CASE month WHEN 'Mar' THEN revenue ELSE null END) AS 'Mar_revenue',
sum(CASE month WHEN 'Apr' THEN revenue ELSE null END) AS 'Apr_revenue',
sum(CASE month WHEN 'May' THEN revenue ELSE null END) AS 'May_revenue',
sum(CASE month WHEN 'Jun' THEN revenue ELSE null END) AS 'Jun_revenue',
sum(CASE month WHEN 'Jul' THEN revenue ELSE null END) AS 'Jul_revenue',
sum(CASE month WHEN 'Aug' THEN revenue ELSE null END) AS 'Aug_revenue',
sum(CASE month WHEN 'Sep' THEN revenue ELSE null END) AS 'Sep_revenue',
sum(CASE month WHEN 'Oct' THEN revenue ELSE null END) AS 'Oct_revenue',
sum(CASE month WHEN 'Nov' THEN revenue ELSE null END) AS 'Nov_revenue',
sum(CASE month WHEN 'Dec' THEN revenue ELSE null END) AS 'Dec_revenue'
from Department
group by id

或用if可取到同样效果,对if不了解的可参考sql中if,ifnull,isnull,nullif基本用法

SELECT id, max(if(month = 'Jan',revenue,null)) Jan_Revenue,max(if(month = 'Feb',revenue,null)) Feb_Revenue,max(if(month = 'Mar',revenue,null)) Mar_Revenue,max(if(month = 'Apr',revenue,null)) Apr_Revenue,max(if(month = 'May',revenue,null)) May_Revenue,max(if(month = 'Jun',revenue,null)) Jun_Revenue,max(if(month = 'Jul',revenue,null)) Jul_Revenue,max(if(month = 'Aug',revenue,null)) Aug_Revenue,max(if(month = 'Sep',revenue,null)) Sep_Revenue,max(if(month = 'Oct',revenue,null)) Oct_Revenue,max(if(month = 'Nov',revenue,null)) Nov_Revenue,max(if(month = 'Dec',revenue,null)) Dec_Revenue
FROM Department GROUP BY id

最后结果:

注意(取自力扣评论):

  1. 列转行 行转列 一般都需要聚合函数 否则取到第一个符合条件的就结束了,sum/min/max/avg都可以
  2. case when的用法使得第一次满足就结束
  3. 一般也要加上group by 先独立分组再聚合
  4. 小细节: sum后要直接跟括号 不能有空格 其他函数应该也如此
  • 行转列

将上题中重新转回,将结果创建一张新表,方便操作

CREATE TABLE department1 AS
SELECT id,
SUM(CASE MONTH WHEN 'jan' THEN revenue ELSE NULL END) AS 'jan_revenue',
SUM(CASE MONTH WHEN 'Feb' THEN revenue ELSE NULL END) AS 'Feb_revenue',
SUM(CASE MONTH WHEN 'Mar' THEN revenue ELSE NULL END) AS 'Mar_revenue',
SUM(CASE MONTH WHEN 'Apr' THEN revenue ELSE NULL END) AS 'Apr_revenue',
SUM(CASE MONTH WHEN 'May' THEN revenue ELSE NULL END) AS 'May_revenue',
SUM(CASE MONTH WHEN 'Jun' THEN revenue ELSE NULL END) AS 'Jun_revenue',
SUM(CASE MONTH WHEN 'Jul' THEN revenue ELSE NULL END) AS 'Jul_revenue',
SUM(CASE MONTH WHEN 'Aug' THEN revenue ELSE NULL END) AS 'Aug_revenue',
SUM(CASE MONTH WHEN 'Sep' THEN revenue ELSE NULL END) AS 'Sep_revenue',
SUM(CASE MONTH WHEN 'Oct' THEN revenue ELSE NULL END) AS 'Oct_revenue',
SUM(CASE MONTH WHEN 'Nov' THEN revenue ELSE NULL END) AS 'Nov_revenue',
SUM(CASE MONTH WHEN 'Dec' THEN revenue ELSE NULL END) AS 'Dec_revenue'
FROM test.Department
GROUP BY id

转换语句:

使用if转换

SELECT a.id,a.jan_revenue revenue,IF(a.jan_revenue ,'jan',NULL) MONTH
FROM department1 a
WHERE a.jan_revenue != 'null'
UNION ALL  (SELECT id,feb_revenue,IF(feb_revenue ,'feb',NULL) MONTH  FROM department1 WHERE feb_revenue != 'null')
UNION ALL  (SELECT id,mar_revenue,IF(mar_revenue ,'mar',NULL) MONTH  FROM department1 WHERE mar_revenue != 'null')
UNION ALL  (SELECT id,apr_revenue,IF(apr_revenue ,'apr',NULL) MONTH  FROM department1 WHERE apr_revenue != 'null')
.
.
.

结果:

.
使用case when 转换还在钻研中,如知道,请指教,谢谢!

sql列转行,行转列,可实操相关推荐

  1. 张同学的 SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理) 学习一下....

    SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理) --可以直接放到查询分析器执行 --判断测试表TmpTCIQuote是否有存在 不存在则创建 if NOT exists (sele ...

  2. Hive SQL中的concat、concat_ws、concat_group列转行,行转列

    目录 1.concat函数,concat_ws函数,concat_group函数 CONCAT() 函数 2.CONCAT_WS(SEPARATOR ,collect_set(column)) 等价于 ...

  3. SQL 横转竖 、竖专横(转载) 列转行 行转列 表旋转

    普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成(得到如下结果 ...

  4. SQL中的行转列和列转行

    导读 SQL是IT行业很多岗位都要求具备的一项能力,对于数据岗位而言更是如此,甚至说扎实的SQL基础也往往是入职这些岗位的必备技能.而在SQL面试中,一道出镜频率很高的题目就是行转列和列转行的问题,可 ...

  5. Sql 语句收集——行转列

    SQL行转列汇总PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (- ...

  6. excel根据条件列转行_“Excel怎样将列转为行 Excel列转行方法“excel有条件转置

    EXCEL中如何将大量竖列数据一次性转为横行.如图. 很简单就可实现,用QQ说吧..87017761打字很麻烦.. Excel怎样将列转为行 Excel列转行方法 目标:将一列数转数据,比如将A列数据 ...

  7. mysql 交叉表行转列_Oracle行转列、列转行的Sql语句总结

    多行转字符串 这个比较简单,用||或concat函数可以实现 SQL Code selectconcat(id,username)strfromapp_user selectid||usernames ...

  8. sql查询:行转列和 列转行

    目录 一.行转列 1.使用case-when-then 2.使用SUM(IF()) 生成列 3.使用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行 4.使用SUM(IF()) 生成 ...

  9. SQL SERVER PIVOT 行转列、列传行

    在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIM ...

  10. DLA SQL技巧:行、列转换和JSON数据列展开

    1. 简介 在数据库SQL处理中,常常有行转列(Pivot)和列转行(Unpivot)的数据处理需求.本文以示例说明在Data Lake Analytics中,如何使用SQL的一些技巧,达到行转列(P ...

最新文章

  1. python 画图 内存-python的内存分析和处理
  2. 网络协议分析 | 传输层 :史上最全UDP、TCP协议详解,一篇通~
  3. linux c多进程多线程,linux下的C\C++多进程多线程编程实例详解
  4. go excel换行符替换_微软Excel与WPS Excel哪个好玩?
  5. 卷积神经网络多输入和多输出
  6. java堆排序工具包_JAVA 排序工具类
  7. C语言 - 常见面试题整理
  8. Nmap扫描和识别服务
  9. 删除的文件怎么恢复?
  10. 20 年来,从微软亚洲研究院走出了中国互联网的半壁江山
  11. DNN与推荐两大门派,一念神魔,功不唐捐
  12. RFI射频干扰、谐波、基波
  13. IDL CMIP6 NC格式数据处理
  14. 论文阅读:Graph Contrastive Learning with Augmentations
  15. 如何在listary中调用谷歌翻译
  16. 上班划水神器:一个可以在控制台玩斗地主项目!
  17. linux-install
  18. FastDFS上传下载文件
  19. sklearn代码查询(学习笔记)
  20. 移动网速测试数据及对比,附2019年北京移动校园卡套餐信息

热门文章

  1. 题库管理|考试管理|基于Web的大学生题库管理系统的设计与实现
  2. linux服务器有没有必要图形,关于linux图形界面的基本知识[新手必读]
  3. C++模拟疫情在校园的传播
  4. 【树链剖分+线段树维护最小费用流】大灾变
  5. OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年
  6. 系统规划与管理师笔记——信息技术知识
  7. iOS:时间戳 表示时间点时间段
  8. non-lvalue in assignment
  9. 电容笔有必要买正版吗?苹果平替笔性价比高的清单
  10. jQuery入门到精通学习教程,收藏我这篇就够了