Oracle 多行转多列

Oracle 多行转多列,列值转为列名

前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容;

之后需要到处问卷明细,,,,麻烦来咯

于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人

然后最终自己写出来了,decode才是核心

废话不多说,看图

需求示例图表:

存储过程,嘿嘿:

 1 create or replace procedure NAG_QUESTIONERSULT_EXP(
 2  V_QID in number,
 3  C_Title out sys_refcursor,
 4  C_Data out sys_refcursor
 5 )
 6 as
 7 /*
 8 导出调查问卷资答案数据
 9 Auth:lzpong 2015/09/01
10 */
11 cursor dusers is --列信息
12        select qss.qss_id,nvl(qss.qss_title,substr(qs.qs_title,0,20)) QSS_TITLE from nag_questions qs,nag_questionss qss
13          where qss.qss_qs_id=qs.qs_id and qs.qs_q_id=V_QID
14          order by qs.qs_order,qss.qss_order;
15 strSql varchar2(10000);
16 begin
17   for ur in dusers loop
18     strSql:=strSql||‘wm_concat(decode(QR_QSS_ID,‘‘‘||ur.qss_id||‘‘‘,QR_QSS_DES,null)) as "‘||ur.qss_title||‘",‘;
19   end loop;
20   open C_Data for
21   ‘select QR_ID,QR_AGENTID,max(QR_CREATEDATE) QR_CREATEDATE,‘||
22   substr(strSql,0,length(strSql)-1)
23 ||‘from (
24 select QR_QS_ID,QR_QSS_ID QR_QSS_ID,‘‘(√)‘‘||QR_QSS_DES QR_QSS_DES,  QR_CREATEDATE,QR_U_ID,QR_AGENTID,QR_ID
25   from nag_questionresult,nag_questions where qr_qs_id=qs_id and qs_q_id=‘||V_QID||‘
26   order by QR_ID
27 )
28 group by QR_ID,QR_AGENTID‘;
29   open C_Title for
30   select q.q_id,q.q_title,q.q_des,qs.qs_id,qs.qs_title ,(select count(qss_id) from nag_questionss qss where qss.qss_qs_id=qs.qs_id) qs_cols
31     from nag_question q,nag_questions qs where q.q_id=qs.qs_q_id and q.q_id=V_QID
32     order by q.q_id,qs.qs_order;
33 end;

实际数据:

 

结果:

时间: 2024-08-05 20:53:13

Oracle 多行转多列的相关文章

oracle 多行转一列,一列转多行

oracle 多行转一列,如下: select to_char(wmsys.wm_concat(t.candi_supplier_id))   from PS.T_PS_BU_AWARD_SUPPLIER t; 通过oracle 10g 提供的wmsys.wm_concat函数,即可以完成行转列的效果. 一列转多行,如下: with a as (select '/ABC/AA/AD/ABD/JI/CC/ALSKD/ALDKDJ' id from dual)select regexp_substr

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_de

Oracle中“行转列”的实现方式

在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”: scott的emp的原始数据为: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 12/17/1980 800.00 20 7499 ALLEN SALESMAN 7698 2/20/1981 1600.00 300.00 30 7521 WARD SALESMAN

Oracle分页查询=======之伪列的使用

========伪列========== 在Oracle数据库中,伪列不存在表中,但是可以从表中查询到 例如:SELECT ROWID 伪列,tname 教师姓名 FROM teacher; =========列号rownum========== 查询rownum返回表中数据的行号; 例如:SELECT ROWNUM 列号,tname 教师,sal 薪资 FROM teacher; 其中rownum只能在条件中做=1或者小于 的操作 例如:SELECT tname 教师名,sal 薪资 FROM

关于EXP-00056: 遇到 ORACLE 错误 1455 ORA-01455: 转换列溢出整数数据类型 EXP-00000: 导出终止失败 的问题解决方法整理

在客户端用exp导出数据库的时候,遇到如下情况 ... .... ...... .. 正在导出同义词 . 正在导出视图 EXP-00056: 遇到 ORACLE 错误 1455 ORA-01455: 转换列溢出整数数据类型 EXP-00000: 导出终止失败 在导完表.同义词.视图后出现EXP-00056: 遇到 ORACLE 错误 1455 这样的问题我连续遇到两次. 我查过网上许多帖子,解决方法都不一样: 第一种: SQL> connect / as sysdba SQL> @catmet

Oracle 多行合并一行 方法

假如有如下表,其中各个i值对应的行数是不定的 Sql代码 SQL> select * from t; I A          D ---------- ---------- ------------------- 1 b          2008-03-27 10:55:42 1 a          2008-03-27 10:55:46 1 d          2008-03-27 10:55:30 2 z          2008-03-27 10:55:55 2 t       

行数据库VS列数据库

一.介绍 目前大数据存储有两种方案可供选择:行存储和列存储.业界对两种存储方案有很多争持,集中焦点是:谁能够更有效地处理海量数据,且兼顾安全.可靠.完整性.从目前发展情况看,关系数据库已经不适应这种巨大的存储量和计算要求,基本是淘汰出局.在已知的几种大数据处理软件中,Hadoop的HBase采用列存储,MongoDB是文档型的行存储,Lexst是二进制型的行存储. 顾名思义,这两种数据库架构在存贮数据时的方式是大相径庭的.在行式数据库中,每一行中的每一块数据都是紧挨着另一块数据存放在硬盘中.一般

Oracle多行记录合并的几种方法

今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nullable Default Comments ------- ------------ -------- ------- -------- COUNTRY VARCHAR2(20) Y CITY VARCHAR2(20) Y SQL> select * from test; COUNTRY CITY ---

Oracle命令行工具基本操作及SQL 命令

Oracle命令行工具基本操作及SQL 命令 1. 基本概念1.1. 数据类型基本数据类型(NUMBER,VARCHAR2,DATE)O RACEL支持下列内部数据类型:VARCHAR2 变长字符串,最长为2000 字符.NUMBER 数值型.LONG 变长字符数据,最长为2G字节.DATE 日期型.RAW 二进制数据,最长为255字节.LONG RAW 变长二进制数据,最长为2G字节.ROWID 二六进制串,表示表的行的唯一地址.CHAR 定长字符数据,最长为255.2. SQL*PLUS这是