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

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

转载于:https://www.cnblogs.com/binquan/p/5218454.html

Oracle 多行变一列的方法相关推荐

  1. oracle 行转列后列名,Oracle 多行转多列,列值转为列名

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

  2. oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名

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

  3. GX works2 三菱PLC 显示注释后代码行变宽的解决方法

    GX works2 三菱PLC 显示注释后代码行变宽的解决方法 解决前 没显示注释前 --------------------------------------------------------- ...

  4. oracle让电脑变卡以及解决方法

    Oracle让电脑变卡的原因 很多人会发现在安装了oracle软件之后,电脑会变的十分的卡,因为在安装了oracle之后,它就会自动在你的后台运行,占用了大量的内存和cpu计算,所以会导致你的运存不够 ...

  5. oracle 动态行转成列,Oracle 行转列 动态出转换的列

    一.运行环境 Win10,Oracle Database 11g r2,plsql 12. 二.效果预览 1.固定转换列的方法 2.存储过程处理 1)调用存储过程 2)查指定的视图即可 3.两种方法的 ...

  6. oracle一行变一列,oracle多行变一行

    今天遇到将多行转为一行的一个操作,多谢oracle开发板的 wildwave 提供了比较通用的解决办法,同时也将自己搜到的这方面资料整理如下,多是用于连接列值的. String集聚连接技术 需要将多行 ...

  7. oracle竖行的两列变成横行_SQL竖列变横列

    oracle 中自连接和 case when,decode 的应用 有表如下: * from test026; ID NAME                 SUBJECT              ...

  8. Excel中多行变为一列,一个简单的方法,一试就会!

    原始数据如下: 想把上述数据变成下边这个样子:(面板模型数据录入需要用到下边这个形式的数据) 步骤: (1)先把所有原始数据转置: (2)再在153.19下的单元格输入"=C2", ...

  9. oracle数据库行转化成列,ORACLE行转列(行转一列,行转多列)

    --listagg(合并多行的值为字符串,只用一列来显示) select status, count(*), listagg(risk_id, ',') within group (order by ...

最新文章

  1. 利用Python中的numpy.ndarray.reshape()对阵列形状进行调整
  2. 配置Linux两节点SSH密钥信任
  3. 《CODM》的成功源自何处?TGA年度移动游戏的总结和思考
  4. linux db2 ssl,IBM DB2 Content Manager V83与手工配置SSL
  5. 架构师必须知道的架构设计原则
  6. oracle 建表id自增长_oracle 左连接、右连接、全外连接、内连接、以及 (+) 号用法...
  7. sigmoid函数求导_交叉熵损失函数的求导(Logistic回归)
  8. 字典java程序_编程字典-Java xxxValue() 方法
  9. R读取MySQL数据出现乱码,解决该问题的方法总结
  10. Echarts数据可视化series-pie饼图,开发全解+完美注释
  11. 【渝粤教育】国家开放大学2018年秋季 1020t国际私法 参考试题
  12. 非参数统计 作业(第五章第六章)
  13. 程序员时间管理-番茄工作法
  14. 无刷直流电机换相原理
  15. mac安装appium时执行appium-doctor命令提示command not found: appium-doctor
  16. 月下夜想曲200.6(攻略3)
  17. html右边显示不全,显示器右边显示不全怎么办
  18. 不可思议有氧机器人_不思议迷宫奇怪的机器人 不思议迷宫奇怪的机器人获取方式一览...
  19. R语言机器学习之caret包详解(一)
  20. B2C电子商务基础系统架构解析

热门文章

  1. 在私企里,男工人能工作到退休年龄60岁吗?
  2. 每天走6000步,血糖真的可以恢复正常吗?
  3. 供应链B2B项目一直赚不到钱
  4. 如何区分真的工厂还是假的工厂
  5. 为何你写的文案打不动不了人心?
  6. 做实体行业现在难吗?
  7. 如果把钱存入余额宝时,所有人都在受益,那么谁在亏损呢?
  8. 有向无环图描述表达式
  9. mysql交互式查询_客户机程序5―MYSQL交互式查询程序[图]_MySQL
  10. sql数据库磁盘响应时间长_SQL Server性能–测量磁盘响应时间