⑴ oracle sql 列转行
使用NOT
IN
,我写一下给你,弊缺等等
SELECT
编号
FROM
表
WHERE
数据
NOT
IN
(数据='1'
and
数据=
'2'
and
数据=‘3’);
这样租陆辩你查出的结果是
数据那一项不在
123
这3个值中的
你看看能悉腔不能理解,可以继续追问
⑵ oracle 列转行的问题。图1是数据库查询的结果 图二是我想要的结果的格式,谢谢了。
如果你的列是固定的,无论多少行,都可以通过典型的case when语句来处理,由于你图1不太能看清,我们假设你想显示列名为typeid,值为1,3,4的分列统计信息,则SQL语句如下:
selectorgid,
sum((casewhentypeid=1then1else0end))astypeid1,
sum((casewhentypeid=3then1else0end))astypeid3,
sum((casewhentypeid=4then1else0end))astypeid4
fromTable001where1=1
groupbyorgid
如能提供清晰的图1,我再写给你完全可执行的SQL
⑶ oracle 列转行
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>
⑷ oracle sql 中 如何实现table的行列转换
你所谓的行列转换应该是指纵表转横表,横表转纵表.
给你个例子
纵表转横表:
使用DECODE语句,可以很方便的将纵表转为横表,例子如下:
原表查询结果:
ID MAJOR CURRENT_CREDITS
------ ---------------- ---------------
10000 Computer Science 98
10000 History 88
10001 Computer Science 75
10000 Economics 66
我们要把各科成绩从同一列转到不同的列中去。
SQL>?select id,
sum(decode(major,’Computer Science’,current_credits,0)) cs,
sum(decode(major,’History’,current_credits,0)) his,
sum(decode(major,’Economics’,current_credits,0)) eco
from students
group by id
ID CS HIS ECO
------ ----------- ------------- -----
10000 98 88 66
10001 75
横表转纵表:
使用 UNION 即可实现将横表转为纵表,以上面的表为例:
转换前:
ID CS HIS ECO
------ ----------- ------------- -----
10000 98 88 66
SQL>?select id, ’Computer Science’ major,cs current_credits
from students
union
select id, ’History’ major,his current_credits
from students
union
select id, ’Economics’ major,eco current_credits
from students
ID MAJOR CURRENT_CREDITS
------ ---------------- ---------------
10000 Computer Science 98
10000 History 88
10000 Economics 66
⑸ Oracle中列转行,如何实现
基本思路:对每班学生排序,根据序号构造列名,拼接动态sql
--测试数据
createtable
("学生"varchar2(10)
,"学号"varchar2(10)
,"班级"varchar2(10)
);
insertinto"表A"
select'张三','100','一班'fromalunionall
select'李四','101','二班'fromalunionall
select'王五','102','一班'fromalunionall
select'赵六','103','三班'fromalunionall
select'李二','104','二班'fromal
--动态拼接Pivot
declare
sqlstrvarchar2(8000):='';
begin
--构造类似于'学号1','学号2',...的字符串
forxin(
selectdistinctrow_number()over(partitionby"班级"orderby"学号")seq
from"表A"orderbyseq)loop
sqlstr:=sqlstr||','''||'学号'||to_char(x.seq)||'''';
endloop;
sqlstr:=substr(sqlstr,2,length(sqlstr)-1);
--将前面构造的字符串放入Pivot语句中
sqlstr:='
select*from(
select"学号","班级",''学号''||to_char(
row_number()over(partitionby"班级"orderby"学号"))seq
from"表A")t
pivot(
max("学号")
forseqin('||sqlstr||')
)';
--dbms_output.put_line(sqlstr);
--将查询结果放入临时视图中
sqlstr:='CREATEORREPLACEVIEWtmp_resultAS'||sqlstr;
--dbms_output.put_line(sqlstr);
executeimmediatesqlstr;
end;
--查看结果
select*fromtmp_result;
结果如下: