行转列方法

  如果有这样的需求,数据库插入的有A表这样的结果,展示要变成B表这样的结果(下边的这个图是摘自别人的,我主要说pivot函数那种方式)

对于这样的需求即需要行转列了。

1、第一种即是大家常见的,oracle、mysql都适用。这种方法也是别人的,我主要说后边的pivot函数那种方式

select [品号],
sum(case when [日期]='06-08' then [数量] else 0 end) as [06-08],
sum(case when [日期]='06-09' then [数量] else 0 end) as [06-09],
sum(case when [日期]='06-10' then [数量] else 0 end) as [06-10],
sum(case when [日期]='06-11' then [数量] else 0 end) as [06-11],
sum(case when [日期]='06-12' then [数量] else 0 end) as [06-12],
sum(case when [日期]='06-13' then [数量] else 0 end) as [06-13]
from tbA
group by [品号]

  通过以上方式可以实现上边A表------>B表的过程。
  速度我测试过,对于130多万的数据,假如来行转列的话,oracle数据库消耗了0.7s,总体来说还能满足我的需求,

2、第二种方式,pivot函数。仅适用oracle

这个函数是oracle 11g的时候新加的,用起来比较方便,同样是上边的A表-----B表的转变,sql如下:
select * from tbA
pivot(sum(数量) for 日期  in ('06-08','06-09','06-10','06-11','06-12')
)

  的确少写了很多东西,但是!也是有好几个注意点的。

使用行转列注意的地方

1、不管第一种还是第二种,转成列的那个日期字段,即:


  这个列,无法写活,我说的那种活是,通过内套一个sql,比如像pivot函数那种行转列方式,我们肯定会想到用下边的这种方式来写:

select * from tbA
pivot(sum(数量) for 日期  in (select 日期 from tbA)
)

  但是这么写直接报错!!!。必须写死才可以,好了,可能还会有人使用mybatis,打算在xml里,先把里边的查询出来的日期查完,拼成一个类似'06-08','06-09','06-10','06-11','06-12' 字符串,再塞进去,这样应该没问题了吧,然后如下这样下:

<select id="selectRowToCol" parameterType="java.util.Map" resultType="java.util.Map">select * from tbA
pivot(sum(数量) for 日期  in (#{dateStr})
)</select>

  但是这么写还是直接报错!!!。
有一种方法是,这里不要使用#{} ,而使用${} 即可。这个我经常用mybatis,竟然一下子忘了这个,被阅读的小伙伴提醒了,感谢大神的提醒。
  我以前是用的下边的方法,感觉脸红了,如下:
我使用的方法是最传统的JDBC那种方式,把sql拼好,然后:

Connection conn = null;ResultSet resultSet = null;try{// 1.加载驱动程序Class.forName("oracle.jdbc.driver.OracleDriver");// 2.获得数据库的连接conn = DriverManager.getConnection(URL, UNAME, PWD);conn.setAutoCommit(false);//事物开始Statement st = conn.createStatement();//下边的这个sql,提前拼好,然后传进去resultSet = st.executeQuery(sql);return resultSet;}catch (Exception e) {e.printStackTrace();}finally{try {if(!conn.isClosed()){conn.close();}} catch (SQLException e) {e.printStackTrace();}}

  这么写才可以查询到,这俩行转列,想写活这个列的方式,我就只知道这一种。

2、对于pivot函数还有几个注意的地方就是,以下边这个sql为例:

select * from tbA
pivot(sum(数量) for 日期  in ('日期1','日期2','日期3','日期4')
)

 (1) [数量] 和 [日期]两个字段,必须对应于select *中的字段名,如果是别名,就必须跟别名对应。
 (2) forin 这两个是配合使用,你无法将in 改为你想要的 like 或者其他的语法。安安稳稳的照人家要求写吧。

行转列方法 及 pivot函数使用问题相关推荐

  1. Oracle pivot函数动态行转列方法

    起因 工作中遇到个问题,需要支持动态行转列,方便报表展示. 起初这样写:

  2. oracle sql列转行_ORACLE 列转行和行转列的SQL和函数

    本文介绍两种行.列转换方法,一种是常规的SQL,一种是ORACLE 11G提供的函数.下面使用一个小例子对这两种方法进行说明. ---------------------------------原始表 ...

  3. function 多个函数用一个_一列转多行多列,用INDIRECT函数,给你一个可套用的公式模板...

    有一个表格,里面只有1列数据,但是有40行,为了查看可以更加方便和打印时节约纸张,现在需要将这1列数据转换成8行5列的数据,不手动复制粘贴,你有什么更好的方法解决吗? 今天,我就教大家一个方法,利用E ...

  4. oracle行转列方法集合

    wm_concat.listagg.xmlagg.pivot函数 一.wm_concat函数(oracle12g版本开始不支持) 语法: select 需要分组的字段,wmsys.wm_concat( ...

  5. SqlServer列转行查询--Pivot函数

    下面来说说SQLServer 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好) 让我们先从一个虚构的场景中来着手吧 万国来朝,很多供应商每天都汇报各 ...

  6. for oracle中pivot_Oracle PIVOT 行转列方法

    数据库中業種的存储如下图: SELECT * FROM M_TORIHIKISAKI_GYOSYU 其中GYIUSYU_CD字段代表不同的業種 而画面需要实现下图所示样式:(将每条数据的業種横向展开显 ...

  7. oracle 按旬统计并且每月小计 行转列 PIVOT函数 与分组小计 ROLLUP 函数

    数据库版本:oralce  11g 表名WM_TD_WATER_DAILY 结构如下,我把没用到的字段隐藏了,全放出来不太好哈. MONITOR_ID为BI_TB_MONITOR_BI的ID ,用于关 ...

  8. sql行转列的3种方法

    行转列的3种方法 max(case when) pivot() 用存储过程行转列 准备数据 --创建表 create table Table_A (商家 string,奶茶 string,价格 big ...

  9. 2021年大数据Hive(五):Hive的内置函数(数学、字符串、日期、条件、转换、行转列)

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的内置函数 一.数学函数 1. 取整函数: round ...

最新文章

  1. 293/294 Flip Game I and II -- back tracking ing
  2. fork()调用使子进程先于父进程被调度
  3. java 快速排序 递归_Java递归快速入门
  4. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
  5. spring cloud微服务注册中心EurekaServer
  6. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9443 -j DNAT
  7. 剑指offer——面试题14:调整数组顺序使奇数位于偶数前面
  8. 大白话vue——slot的作用与使用
  9. 基础级拆机-神舟战神GX8CP5s1上8700发现较为鸡肋-仿CP7s2
  10. 【无人驾驶系列七】高精度地图在无人驾驶中的应用
  11. 打印设置自定义表尾_教大家Excel2013表格中如何打印固定的表头和表尾
  12. 955 互联网公司白名单来了!这些公司月薪20k,没有996!福利榜国内大厂只有这家!
  13. html页面调用微信扫一扫功能,微信JSSDK调用微信扫一扫功能的方法
  14. String.matches()的用法
  15. Android 联想K5 Play 8.0 Notification突破拦截(vdex反编译 )
  16. 模拟SPI进行TF卡操作+Fatfs文件系统移植
  17. 使命召唤手游如何在电脑上玩 使命召唤手游模拟器教程
  18. Java—异或运算^的使用详解
  19. GRCh38参考数据分析流程(转)
  20. Arduino笔记实验(初级阶段)—继电器模块

热门文章

  1. 陈皓----程序员如何把控自己的职业(转)
  2. 旧文新发之三----清明种种
  3. Uncaught SyntaxError: The requested module ‘/node_modules/.vite/deps/vue.js?v=3e1adf4e‘ does not ...
  4. 2008北京奥运开幕式高清晰视频下载 (换个角度欣赏高清奥运开幕式!NBC电视台720P HDTV)...
  5. 无法启动此程序 因为计算机中丢失xlive,光环2xlive.dll文件丢失的解决方法
  6. 什么是FBV和CBV?
  7. leetcode用python还是c_刷Leetcode里面遇到的问题(Python)
  8. 济南市房屋租赁协议书
  9. Centos安装Redis教程,详细步骤
  10. js调用打印接口打印web页面之——使用lodop组件打印jsp web页面