Oracle 多行变一列的方法
多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法。
情况是这样的。以下数据前几列是一样的,需要把VAT_VALUE_CHAR 的值放在同一行上。
SELECT *
FROM ps_vat_defaults defaults
WHERE defaults.vat_driver = 'VAT_ENT_RGSTRN'
AND defaults.vat_driver_key1 = 'AMB19'
AND defaults.vat_driver_key2 = 'DEU'
AND vat_default_type IN ('DGS',
'EUGS',
'DSP',
'EUSP');
SELECT VAT_DRIVER
, VAT_DRIVER_KEY1
, VAT_DRIVER_KEY2
, MAX( CASE WHEN VAT_DEFAULT_TYPE = 'DGS' THEN VAT_VALUE_CHAR END ) AS VALUE1
, MAX(CASE WHEN VAT_DEFAULT_TYPE = 'DSP' THEN VAT_VALUE_CHAR END) AS VALUE2
, MAX( CASE WHEN VAT_DEFAULT_TYPE = 'EUGS' THEN VAT_VALUE_CHAR END) AS VALUE3
, MAX(CASE WHEN VAT_DEFAULT_TYPE = 'EUSP' THEN VAT_VALUE_CHAR END) AS VALUE4
FROM ps_vat_defaults defaults
WHERE defaults.vat_driver = 'VAT_ENT_RGSTRN'
AND vat_default_type IN ('DGS', 'EUGS', 'DSP', 'EUSP')
GROUP BY VAT_DRIVER, VAT_DRIVER_KEY1, VAT_DRIVER_KEY2
wm_concat函数据说是10g之后才有的。他可以把某个字段一列的所有值用逗号分隔的形式放在一个cell里。
SELECT to_char(SUBSTR( wm_concat(VAT_VALUE_CHAR), 0,80))VAT_VALUE_CHAR from ps_vat_defaults defaults where defaults.vat_driver = 'VAT_ENT_RGSTRN' AND defaults.vat_driver_key1='AMB19' AND defaults.vat_driver_key2='NLD' AND vat_default_type in ( 'DGS','EUGS','DSP','EUSP')
结果是一行一列(SAL,PURC,ECSL,ECPR
oracle 行列互转(来自www.askoracle.org整理)
1.使用case when 列转行

- SELECT NAME,
- MAX(CASE WHEN COURSE='语文' THEN SCORE END) "语文",
- MAX(CASE WHEN COURSE='数学' THEN SCORE END) "数学",
- MAX(CASE WHEN COURSE='英语' THEN SCORE END) "英语",
- MAX(CASE WHEN COURSE='物理' THEN SCORE END) "物理",
- SUM(SCORE) "总分"
- FROM stu GROUP BY NAME;

2.一行数据行转列

- SELECT NAME,
- CASE
- WHEN LV = 1 THEN '语文' --常量
- WHEN LV = 2 THEN '数学' --常量
- WHEN LV = 3 THEN '英语' --常量
- WHEN LV = 4 THEN '物理' --常量
- END 科目,
- CASE
- WHEN LV = 1 THEN langu --列名
- WHEN LV = 2 THEN math--列名
- WHEN LV = 3 THEN english--列名
- WHEN LV = 4 THEN pycial--列名
- END 成绩
- FROM ( SELECT * FROM course, (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 4) ) --成绩对应的列数
- ORDER BY 1, 2;

3.结果集转换成一行
- --查询每个部门的人数
- SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO ORDER BY 1;

- --将上面的结果转为一行,可以使用 SUM 或者 COUNT 来求出。
- SELECT SUM(CASE WHEN DEPTNO = 10 THEN 1 END) D_10,
- SUM(CASE WHEN DEPTNO = 20 THEN 1 END) D_20,
- SUM(CASE WHEN DEPTNO = 30 THEN 1 END) D_30
- FROM EMP;
- --也可以使用下面的方法。
- SELECT CASE WHEN DEPTNO = 10 THEN CN END D_10,
- CASE WHEN DEPTNO = 20 THEN CN END D_20,
- CASE WHEN DEPTNO = 30 THEN CN END D_30
- FROM (SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO);
- --和刚讲的一样,生成了三行三列数据,使用 MAX 来获取。
- SELECT MAX(CASE WHEN DEPTNO = 10 THEN CN END) D_10,
- MAX(CASE WHEN DEPTNO = 20 THEN CN END) D_20,
- MAX(CASE WHEN DEPTNO = 30 THEN CN END) D_30
- FROM (SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO);

4.把结果集转换成多行
--每种职位一列,得到下面的结果集 (每种职业的列里面有多余的 NULL,如果使用MAX的话,一列只会取一条最大的值了)

- SELECT MAX(CASE JOB WHEN 'CLERK' THEN ENAME END) CLERK,
- MAX(CASE JOB WHEN 'ANALYST' THEN ENAME END) ANALYST,
- MAX(CASE JOB WHEN 'MANAGER' THEN ENAME END) MANAGER,
- MAX(CASE JOB WHEN 'PRESIDENT' THEN ENAME END) PRESIDENT,
- MAX(CASE JOB WHEN 'SALESMAN' THEN ENAME END) SALESMAN
- FROM (SELECT ENAME,
- JOB,
- --每组都是从 1 开始排序,而每列里面只有一组有数据。也就是 RN 相同的在每列里面只有一条数据
- ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY ENAME) RN
- FROM EMP)
- GROUP BY RN
- ORDER BY RN;

Oracle 多行变一列的方法的更多相关文章
- oracle 多行转多列查询
oracle 多行转多列查询 ---create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);inse ...
- Oracle 多行转多列
Oracle 多行转多列,列值转为列名 前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...
- Oracle字符串行拆分成列的三种方式
Oracle字符串行拆分成列的三种方式 --muphy 开发过程中经常会遇到将前台多个值用逗号连接一同传递到后台查询,这个用逗号连接的字符串分隔的每个字符串分别对应Oracle数据库表的不同行. 如下 ...
- “ORA-06550: 第 1 行, 第 7 列”解决方法
将本机能正常运行的维修生产日志代码发布到公司内测环境里无法正常运行,报错如下: execute() - pls–QuartzJob.java–quartzjob 开始执行! java.sql.SQLE ...
- oracle 多行变一行 wmsys.wm_concat
背景 还是那个问题,部分程序员喜欢用sql解决问题.发现了这个函数,当初真是大喜过望,现在是哭笑不得.10g支持这个函数,11好像不支持了,而且只有oracle支持,其实自己写个通用方法 ...
- Oracle 多行转多列,列值转为列名
前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...
- Oracle 多行变一行
https://blog.csdn.net/rainyspring4540/article/details/50231521
- 【收藏】SQL多行变一列
CREATE TABLE DEPT (DeptNo INT IDENTITY(1, 1)NOT NULL , Country VARCHAR(50) , Location VARCHAR(50) ...
- SQL多行变一列
CREATE TABLE DEPT (DeptNo INT IDENTITY(1, 1)NOT NULL , Country VARCHAR(50) , Location VARCHAR(50) ...
随机推荐
- 洛谷 P2733 家的范围 Home on the Range Label:二维数组前缀和
题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形的牧场上吃草.)遗憾的是,他的奶牛已经毁坏一些土地.( 一 ...
- CSS笔记2
1. CSS基础选择器 html负责结构 ,css负责样式,js负责行为 css写在head标签里面,容器style标签 <style type="text/css" ...
- 如何在VS2012中使用IL Disassembler中查看项目编译生成的程序集
2016-05-26 11:48:46 测试的WPF项目 MainWindow.xaml代码 MainWindow.xaml.cs 代码 在学习WPF的时候,想验证:删除MainWindow.xaml ...
- <八>JDBC_重构DAO查询方法
DAO类: import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import ...
- java核心技术第一卷
sell窗口(dos窗口命令)中要注意大小写: 编译java文件需要加上扩展名,运行java.class时只要文件名java,不需要扩展名:
- 随机数是骗人的,.Net、Java、C为我作证(转)
几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = ne ...
- php ajax请求和返回
define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']); d ...
- macOS 10.12 解决模拟器不流畅的一段命令行
sudo sysctl -w kern.timer.coalescing_enabled=0
- Organization SYMMETRIC MULTIPROCESSORS
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION Figure 17.4 depicts i ...
- 几何服务,cut功能,输入要素target(修改前)内容。
几何服务,cut功能测试,输入要素target(修改前)内容. {"geometryType":"esriGeometryPolyline","geo ...