十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
如果你要做转换查询,真心劝你不要这么干,我的写法很麻烦,一张表不停的查询,逻辑读肯定搞得要死。
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站设计、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的大观网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
如果是往下面这张表灌数,那么可以写循环,慢慢来一行对应一列,可以根据表的列和数据的对应关系往里面灌,这个相对简单些。
我的写法大概是子查询+union all 上面为a表
那么就写为select ‘第一季度' 销售额,(select 第一季度销售额 from a where 产品名称='奶酪')奶酪,(select 第一季度销售额 from a where 产品名称='啤酒') from dual
union all
还像上面那么写,写第二季度
union all
第三季度
union all
第四季度
一张表重读查询8次,如果表很大,我估计机器会宕掉的。
因为单独从一列来看也可以理解为列转行,所以用case when写也可以,这么写似乎读取的次数会少些,不过要用到group by分组,天知道二者最后谁的消耗大。不过如果表很大的话,还是那句话,建议新建表然后灌数,这么直接查,真的会死掉的。
以上为个人建议,如果找到什么好写法,也可以研究下。
SQL create table t (a number, b varchar2(10));
表已创建。
SQL insert into t values(1,'A');
已创建 1 行。
SQL insert into t values(1,'B');
已创建 1 行。
SQL insert into t values(2,'A');
已创建 1 行。
SQL insert into t values(2,'B');
已创建 1 行。
SQL insert into t values(3,'C');
已创建 1 行。
SQL insert into t values(3,'F');
已创建 1 行。
SQL insert into t values(4,'D');
已创建 1 行。
SQL commit;
提交完成。
SQL select a,max(decode(c,1,b,null)),
2 max(decode(c,2,b,null)),
3 max(decode(c,3,b,null))
4 from(select a,b,row_number()over(partition by a order by b ) c from t)
5* group by a
SQL /
A MAX(DECODE MAX(DECODE MAX(DECODE
---------- ---------- ---------- ----------
1 A B
2 A B
3 C F
4 D
SQL
可以使用wm_concat()函数;
下面是我做的一个例子,可以参考下,当然具体语法可以百度,也可以去官方文档查:
SCOTT@ ysdb1show user
USER is "SCOTT"
SCOTT@ ysdb1create table test_concat(id number(5),name varchar2(10));
Table created.
SCOTT@ ysdb1insert into test_concat values(1,'a');
1 row created.
SCOTT@ ysdb1insert into test_concat values(1,'b');
1 row created.
SCOTT@ ysdb1insert into test_concat values(1,'c');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'q');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'w');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'e');
1 row created.
SCOTT@ ysdb1insert into test_concat values(2,'f');
1 row created.
SCOTT@ ysdb1select * from test_concat;
ID NAME
---------- ----------
1 a
1 b
1 c
2 q
2 w
2 e
2 f
7 rows selected.
SCOTT@ ysdb1select wm_concat(name) from test_concat;
WM_CONCAT(NAME)
--------------------------------------------------------------------------------
a,b,c,q,w,e,f
SCOTT@ ysdb1select id,wm_concat(name) from test_concat group by id;
ID WM_CONCAT(NAME)
---------- --------------------------------------------------------------------------------
1 a,c,b
2 q,f,e,w
INSERT INTO 新表 (SELECT ID, '呼吸系统疾病' FROM 原表 WHERE 呼吸系统疾病有无 = 1 UNION SELECT ID, '消化系统疾病' FROM 原表 WHERE 消化系统疾病有无 = 1
UNION SELECT ID, '循环系统疾病' FROM 原表 WHERE 循环系统疾病有无 = 1)
如果使用行转列,还得使用merge into,还不如上面的语句清晰。
oracle中列传行可用wm_concat来实现。
如test表中数据如下:
现要将name列一列显示成行,可用如下语句:
select wm_concat(name) from test;结果:
基本思路:对每班学生排序,根据序号构造列名,拼接动态sql
--测试数据
create table
("学生" varchar2(10)
,"学号" varchar2(10)
,"班级" varchar2(10)
);
insert into "表A"
select '张三','100','一班' from dual union all
select '李四','101','二班' from dual union all
select '王五','102','一班' from dual union all
select '赵六','103','三班' from dual union all
select '李二','104','二班' from dual
--动态拼接Pivot
declare
sqlstr varchar2(8000):='';
begin
--构造类似于 '学号1','学号2',... 的字符串
for x in (
select distinct row_number() over (partition by "班级" order by "学号") seq
from "表A" order by seq ) loop
sqlstr := sqlstr || ',''' || '学号' ||to_char(x.seq)||'''';
end loop;
sqlstr:=substr(sqlstr,2,length(sqlstr)-1);
--将前面构造的字符串放入Pivot语句中
sqlstr:='
select * from (
select "学号","班级", ''学号''|| to_char(
row_number() over (partition by "班级" order by "学号")) seq
from "表A") t
pivot(
max("学号")
for seq in ('||sqlstr||')
)';
--dbms_output.put_line(sqlstr);
--将查询结果放入临时视图中
sqlstr := 'CREATE OR REPLACE VIEW tmp_result AS '|| sqlstr;
--dbms_output.put_line(sqlstr);
execute immediate sqlstr;
end;
--查看结果
select * from tmp_result;
结果如下: