Oracle 多行变一列的方法

时间:2022-04-26 01:07:23

多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法。

情况是这样的。以下数据前几列是一样的,需要把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');

Oracle 多行变一列的方法

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

Oracle 多行变一列的方法

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 列转行

  Oracle 多行变一列的方法

Oracle 多行变一列的方法
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;
Oracle 多行变一列的方法

Oracle 多行变一列的方法

2.一行数据行转列

Oracle 多行变一列的方法

Oracle 多行变一列的方法
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;
Oracle 多行变一列的方法

Oracle 多行变一列的方法

3.结果集转换成一行

--查询每个部门的人数
SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO ORDER BY 1;

Oracle 多行变一列的方法

Oracle 多行变一列的方法
--将上面的结果转为一行,可以使用 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);
Oracle 多行变一列的方法

4.把结果集转换成多行

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

Oracle 多行变一列的方法

Oracle 多行变一列的方法
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 多行变一列的方法的更多相关文章

  1. oracle 多行转多列查询

     oracle 多行转多列查询  ---create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);inse ...

  2. Oracle 多行转多列

    Oracle 多行转多列,列值转为列名   前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...

  3. Oracle字符串行拆分成列的三种方式

    Oracle字符串行拆分成列的三种方式 --muphy 开发过程中经常会遇到将前台多个值用逗号连接一同传递到后台查询,这个用逗号连接的字符串分隔的每个字符串分别对应Oracle数据库表的不同行. 如下 ...

  4. &OpenCurlyDoubleQuote;ORA-06550&colon; 第 1 行&comma; 第 7 列”解决方法

    将本机能正常运行的维修生产日志代码发布到公司内测环境里无法正常运行,报错如下: execute() - pls–QuartzJob.java–quartzjob 开始执行! java.sql.SQLE ...

  5. oracle 多行变一行 wmsys&period;wm&lowbar;concat

    背景        还是那个问题,部分程序员喜欢用sql解决问题.发现了这个函数,当初真是大喜过望,现在是哭笑不得.10g支持这个函数,11好像不支持了,而且只有oracle支持,其实自己写个通用方法 ...

  6. Oracle 多行转多列&comma;列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  7. Oracle 多行变一行

    https://blog.csdn.net/rainyspring4540/article/details/50231521

  8. 【收藏】SQL多行变一列

    CREATE TABLE DEPT (DeptNo INT IDENTITY(1, 1)NOT NULL ,  Country VARCHAR(50) ,  Location VARCHAR(50) ...

  9. SQL多行变一列

    CREATE TABLE DEPT (DeptNo INT IDENTITY(1, 1)NOT NULL ,  Country VARCHAR(50) ,  Location VARCHAR(50) ...

随机推荐

  1. redis 用setbit&lpar;bitmap&rpar;统计活跃用户

    getspool.com的重要统计数据是实时计算的.Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间.在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的 ...

  2. POJ2367 Genealogical tree &lpar;拓扑排序&rpar;

    裸拓扑排序. 拓扑排序 用一个队列实现,先把入度为0的点放入队列.然后考虑不断在图中删除队列中的点,每次删除一个点会产生一些新的入度为0的点.把这些点插入队列. 注意:有向无环图 g[] : g[i] ...

  3. JSON的数据类型

    数据类型简介 在计算机中,我们需要知道正在处理什么类型的数据,因为不同类型的数据有着不同的操作途径.可以让两个阿拉伯数字相乘,但是不能让两个单词相乘. 在计算机科学中,有一种数据类型被称为原始数据类型 ...

  4. Levenshtein Distance &plus; LCS 算法计算两个字符串的相似度

    //LD最短编辑路径算法 public static int LevenshteinDistance(string source, string target) { int cell = source ...

  5. Chapter 5 Blood Type——9

    He grimaced. 他扮了一个鬼脸. "Or better," I continued, the pent-up annoyance flowing freely now, ...

  6. 523&period; Continuous Subarray Sum

    class Solution { public: bool checkSubarraySum(vector<int>& nums, int k) { unordered_map&l ...

  7. Angular2&plus;AngularJS

    AngularJS 系列: 1.angular.module 的定义 var mapApp = angular.module("positionSalaryEditApp",[&q ...

  8. python 关于文件操作

    ,要求在文件 .py 第六行插入一句话: #cat /root/python/2.py 2 昨夜雨疏风骤1 3 昨夜雨疏风骤2 4 昨夜雨疏风骤3 5 昨夜雨疏风骤4 6 昨夜雨疏风骤5 7 昨夜雨疏 ...

  9. &lbrack;Docker&rsqb; Getting Started with Container Networks

    It is possible to group containers into a network and we can create multi networks so that container ...

  10. java中的static(包括类前面修饰的static、方法前面修饰的static、成员变量前面修饰的static)

    static是静态修饰符: 什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个 ...