• NULL 博文链接：https://13966692733-163-com.iteye.com/blog/1192434
• 1.创建表t_result create table t_result (d varchar2(10),result varchar2(4)); 2.往表中插入数据 insert into t_result values ('2014-01-01','胜');...insert into t_result values ('2014-01-01','胜');...

1.创建表t_result
create table t_result
(d varchar2(10),result varchar2(4));
2.往表中插入数据
insert into t_result values ('2014-01-01','胜');
insert into t_result values ('2014-01-01','胜');
insert into t_result values ('2014-01-01','负');
insert into t_result values ('2014-01-02','胜');
insert into t_result values ('2014-01-02','负');
insert into t_result values ('2014-01-02','负');

select * from t_result;
解决办法一：
select t1.d,t1.c1 胜,t2.c2 负 from
(select count(result) c1,d from t_result where result = '胜' group by d) t1
LEFT outer join
(select count(result) c2,d from t_result where result = '负' group by d) t2
on t1.d = t2.d;
解决办法二：-----推荐方法
select * from t_result pivot (count(result) for result in('胜','负'))
解决办法三：
SELECT d,SUM(decode(result,'胜',1,0)),SUM(decode(result,'负',1,0))
FROM t_result
GROUP BY d
解决办法四：
select d,
sum(case result when '胜' then 1 else 0 end )胜,
sum(case result when '负' then 1 else 0 end )负
from t_result group by d order by d;
取自：https://www.cnblogs.com/markfeifei/p/4009343.html
自己做过测试，然后外加一种方法

例子二：
CREATE TABLE studentScores(userName varchar(20), subject varchar(30), score FLOAT );INSERT INTO studentScores(username,subject,score) values( '张三', '语文', 80);INSERT INTO studentScores values ('张三', '数学', 90);INSERT INTO studentScores values ('张三', '英语', 70);INSERT INTO studentScores values ('张三', '生物', 85);INSERT INTO studentScores values ('李四', '语文', 80);INSERT INTO studentScores values ('李四', '数学', 92);INSERT INTO studentScores values ('李四', '英语', 76);INSERT INTO studentScores values ('李四', '生物', 88);INSERT INTO studentScores values ('码农', '语文', 60);INSERT INTO studentScores values ('码农', '数学', 82);INSERT INTO studentScores values ('码农', '英语', 96);INSERT INTO studentScores values ('码农', '生物', 78);select * from studentScores;
select username,WM_CONCAT(score),SUM(SCORE) from studentScores group by username;
解决办法一：
SELECT KIN.*,  KIN.a+KIN.b AS TOTAL FROM  (SELECT *  FROM studentScores PIVOT (sum(SCORE) FOR subject IN ('语文' AS A , '数学' AS B) )  ) KIN;
解决办法二： SELECT username, MAX(DECODE(subject, '语文', SCORE)) A, MAX(DECODE(subject, '数学', SCORE)) B, MAX(DECODE(subject, '英语', SCORE)) C, MAX(DECODE(subject, '生物', SCORE)) D, SUM(SCORE) TOTAL FROM studentScores GROUP BY username;

转载于:https://www.cnblogs.com/fengxiaoyuan/p/9982033.html
展开全文
• NULL 博文链接：https://vernonchen163.iteye.com/blog/1902976
• tabe1 科目 等级 语文 优良 语文 及格 语文 及格 数学 优良 数学 优良 -------------------- 科目 优良 及格 语文 1 2 数学 2 0 oarcle如何将表一转化成表二的形式。
• SELECT MC, NVL(pdjsl, 0) pdjsl, NVL(tpsl, 0) tpsl FROM (SELECT T.MC, T.sblx_dm, T.YWL FROM (SELECT c.dt_mc MC, b.sblx_dm, count(a.sbbm) YWL FROM dt_sbjbxx A, dm_sblx B, d...
SELECT MC, NVL(pdjsl, 0) pdjsl, NVL(tpsl, 0) tpsl   FROM (SELECT T.MC, T.sblx_dm, T.YWL           FROM (SELECT c.dt_mc MC, b.sblx_dm, count(a.sbbm) YWL                   FROM dt_sbjbxx A, dm_sblx B, dt_jbxx c                  WHERE a.sblx_dm = B.sblx_dm                    and a.dtjgdm = c.dt_dm                  group by c.dt_mc, b.sblx_dm) T) PIVOT(SUM(YWL) FOR sblx_dm IN('05'                                                                                pdjsl,                                                                                '01' tpsl))
展开全文
• 最近遇到转列的问题需要将同一个id下面的数据组装起来 与另一张主表中的数据组成一一条数据 sql代码如下 SELECT * FROM SE_REQ_ITEM_INFO srii LEFT JOIN ( SELECT ENTITY_ID, CASE WHEN attr_id = '...
最近遇到行转列的问题需要将同一个id下面的数据组装起来

与另一张主表中的数据组成一一条数据

sql代码如下

SELECT * FROM SE_REQ_ITEM_INFO srii
LEFT JOIN ( SELECT ENTITY_ID,
CASE WHEN attr_id = '201' THEN value END "201",
CASE WHEN attr_id = 202 THEN value END "202",
CASE WHEN attr_id = 203 THEN value END "203"
FROM SE_REQ_ITEM_VALUE) ITEM_VALUE ON srii.ID = ITEM_VALUE.ENTITY_ID 
行专列之后表达式中注意的点

可以看到值像一个稀疏矩阵一样，因此行专列还需要进行groupby操作 正确sql如下：
SELECT * FROM SE_REQ_ITEM_INFO srii LEFT JOIN (
SELECT ENTITY_ID, max(CASE
WHEN attr_id = '201' THEN value
ELSE ''
END) 201, max(CASE
WHEN attr_id = 202 THEN value
ELSE ''
END) 摘要
, max(CASE
WHEN attr_id = 203 THEN value
ELSE ''
END) 字数
FROM SE_REQ_ITEM_VALUE
GROUP BY ENTITY_ID) ITEM_VALUE ON srii.ID = ITEM_VALUE.ENTITY_ID
注意 groupby后面跟的是需要合并出来的id（共同的id）
展开全文
• 普通的实现转列方式比较复杂, wm_concat 函数只适合用来合并字符型单元格的内容.应当用 pivot 函数来实现(转自我自己的博客园)
首先,做准备工作
建表:

-- Create table
create table DEMO
(
n_iden       NUMBER,
c_order_code NVARCHAR2(50),
c_order_name NVARCHAR2(50),
c_friut      NVARCHAR2(50),
c_amount     NUMBER(20,4),
d_build      DATE,
c_seller     NVARCHAR2(50)
)
tablespace MYORCL1
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
comment on column DEMO.n_iden
is 'ID';
comment on column DEMO.c_order_code
is '订单号';
comment on column DEMO.c_order_name
is '订单名称';
comment on column DEMO.c_friut
is '水果类型';
comment on column DEMO.c_amount
is '水果数量';
comment on column DEMO.d_build
is '创建日期';
comment on column DEMO.c_buyer
is '订货人';
comment on column DEMO.c_seller
is '买货人';
插入数据:

insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (1, 'order_num1', '第一单', '苹果', 1.0000, to_date('11-01-2017', 'dd-mm-yyyy'), null, null);

insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (2, 'order_num1', '第一单', '橘子', 2.0000, to_date('11-01-2017', 'dd-mm-yyyy'), null, null);

insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (3, 'order_num1', '第一单', '香蕉', 3.0000, to_date('11-01-2017', 'dd-mm-yyyy'), null, null);

insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (4, 'order_num2', '第二单', '苹果', 4.0000, to_date('10-01-2017', 'dd-mm-yyyy'), null, null);

insert into DEMO (N_IDEN, C_ORDER_CODE, C_ORDER_NAME, C_FRIUT, C_AMOUNT, D_BUILD, C_BUYER, C_SELLER)
values (5, 'order_num2', '第二单', '橘子', 5.0000, to_date('10-01-2017', 'dd-mm-yyyy'), null, null);

如果我们要实现以订单名称和订单代码为一个单位的数据时
order_code order_name 苹果 橘子 香蕉
order_num1 第一单 1 2 3 order_num2 第二单 4 5 0
普通的实现方式比较复杂,并且当苹果种类较多的时候会变得极其不适用
普通方法的代码如下
select c_order_code ,c_order_name,sum(decode(c_friut,'苹果',c_amount,0)) 苹果, sum(decode(c_friut,'橘子',c_amount,0)) 橘子, sum(decode(c_friut,'香蕉',c_amount,0)) 香蕉 from DEMO group by c_order_code ,c_order_name
用 PIVOT 函数如下
select * from ( (select c_order_code,c_order_name,c_friut,C_AMOUNT from demo) pivot( sum(C_AMOUNT)for c_friut in ('苹果','橘子','香蕉') ) )
翻译:pivot :轴,中心
sum() :单聚合函数
for:对于,关于
c_friut : 转换为行的字段
in('苹果','橘子','香蕉') : 以三种水果为分组
上述两种的查询结果为:

还有一种行专列的形式,是用 wm_concat函数
select c_order_code,c_order_name, to_char(wm_concat(c_friut)) from demo group by c_order_code,c_order_name;
order_num1  第一单 橘子,苹果,香蕉
通常是配合替换函数使用:
因为作者水平有限,难免有疏漏之处.望读者不吝批评指正!

展开全文
• Oracle 11g之后，支持使用PIVOT实现转列 函数说明： PIVOT（任意聚合函数 FOR 列名 IN（类型）） 其中，【聚合函数】聚合的字段，是需要转化为列值的字段；【列名】是需要转化为列标识的字段，【类型】即是...
• create table scoreTable(name varchar2(20),score varchar2(20)); insert into scoreTable values('a','50'); insert into scoreTable values('a','60'); insert into scoreTable values('a','80');...
• select * from (select tablespace_name, table_name, num_rows from dba_tables) pivot (sum(num_rows) for table_name in ('MB_JSBSF' as MB_JSBSF, 'MB_JSBSFYY' MB_JSBSFYY, 'MB_JSBSFYY_BAK' MB_JSBSFYY_BAK, '
• Oracle行专列函数Listagg()   这是一个Oracle转列函数：LISTAGG()  www.2cto.com   先看示例代码： Sql代码 with temp as(  select 'China' nation ,'Guangzhou' city from dual ...
• 关于oracle行转列函数LISTAGG()XMLAGG() LISTAGG() 例如: 查出每个职位的所有人名单： 但是如果遇到转为一后的字段过于太长太长，会报错，如下： 这样只有使用另一种方法查出来转为的结果类型转为clob ...
• Oracle行转列、列转行的Sql语句总结 多行转字符串 这个比较简单，用||或concat函数可以实现 SQL Code select concat(id,username) str from app_user select id||username str from app_user 字符串转多列 ...
• ## ORACLE行专列转换

千次阅读 2013-03-28 19:43:58
一、采用SQL decode和PL/SQL函数实现 1、固定列数的行列转换 如 student subject grade --------------------------- student1 语文 80 student1 数学 70 student1 英语 60 student2 语文 90 ...
• oracle wm_concat函数,用于列转行,逗号分隔本文将详细介绍此功能的应用
• 文章目录pivot：转列unpivot：列转行 pivot：转列 测试语句： WITH t_test AS( SELECT '1' ID, '张三' NAME, '70' score, 'CHINESE' subject FROM dual UNION ALL SELECT '1' ID, '张三' NAME, '90' score, '...
• ## Oracle行转列详解

万次阅读 2019-07-05 17:16:00
一、建表与插入数据 1.1、建表 create table kecheng (   id     NUMB...
• select E.EXPERT_ID_, E.COM_NAME_, E.EMP_NAME_, E.STATUS_, ER.PARENT_PRO_CODE_, wm_concat(ER.PRO_CODE_) as PRO_CODE_ from MP_EXPERT E left outer join MP_EXPERT_RELATION ER on ER.EXPERT_ID_ = E.EXPERT_I...
• 行专列 select rq, count(decode(shengfu, '胜', 1)) 胜, count(decode(shengfu, '负', 2)) 负 from tmp group by rq; 3.create table STUDENT_SCORE ( name VARCHAR2(20), subject VARCHAR2(20), score NUMBER(4,1...
• select t1.* from V_Forp_User t1 where t1.state= ‘1’ and t1.FK_DomainID= 1 and ( t1.id in ( SELECT REGEXP_SUBSTR(a.id, ‘[^,]+’, 1, rownum) as f_value_066 from (select to_char(wm_concat(to_char(pb....
• Oracle行转列 需求： 需要获取8月和9月调用接口次数 名称 8月 9月 合计 实现方案1： select trx_type as "名称", AUG as "8月", SEPT as "9月", SUMS as "合计" from ( select trx...
• 一、简单介绍 最近项目需要进行转列，经过上网查资料发现了wmsys.wm_concat和LISTAGG函数，在这分享给...wmsys.wm_concat是oracle 10g推出的，用来连接字符串，LISTAGG是oracle 11g推出的，它的作用和wmsys.w...

...