She*_*eif 3 sql oracle group-by case having
我试图找出如何查询表(该表实际上是一个结果集,因此它将是一个子查询),将其分组ColA=ColB(见下文),并一步创建一个计算字段.
所以,如果我的测试数据看起来像
ColA ColB ColC
1 1 aaa 1 2 bbbb 1 3 cccc 2 2 dddd 3 3 eeee 3 4 ffff 3 5 gggg 3 6 hhhh 4 4 iiii 5 5 jjjj 6 6 kkkk 6 7 llll 6 8 mmmm
我想只检索行,ColA=ColB并添加一个新列,告诉我原始数据是否ColA重复.见下文.
ColA ColB ColC multiples
1 1 aaaa yes 2 2 dddd no 3 3 eeee yes 4 4 iiii no 5 5 jjjj no 6 6 kkkk yes
有人可以帮我解决语法问题吗?我一直在玩Group By和SubSelect无济于事.我是否需要对多个字段使用case语句?
发布create table和insert语句而不是Desc表更有帮助,并从table_name中选择*; http://tkyte.blogspot.com/2005/06/how-to-ask-questions.html
create table test_repeat(
cola number,
colb number,
colc varchar2(20)
);
insert into test_repeat values (1,1,'aaa');
insert into test_repeat values (1,2,'bbbb');
insert into test_repeat values (1,3,'cccc');
insert into test_repeat values (2,2,'dddd');
insert into test_repeat values (3,3,'eeee');
insert into test_repeat values (3,4,'ffff');
insert into test_repeat values (3,5,'gggg');
insert into test_repeat values (3,6,'hhhh');
insert into test_repeat values (4,4,'iiii');
insert into test_repeat values (5,5,'jjjj');
insert into test_repeat values (6,6,'kkkk');
insert into test_repeat values (6,7,'llll');
insert into test_repeat values (6,8,'mmmm');
commit;
Run Code Online (Sandbox Code Playgroud)
1.您可以使用Oracle分析函数Lead 查看结果集,以查看colA是否与下一行相同(在订购之后..),如...
select * from
(select colA, colb,
(case when colA = (lead(cola) over
(partition by colA order by cola, colb))
then 'Yes'
else 'No'
end) multiples,
colc
from test_repeat)
where colA = colb
/
COLA COLB MUL COLC
---------- ---------- --- --------------------
1 1 Yes aaa
2 2 No dddd
3 3 Yes eeee
4 4 No iiii
5 5 No jjjj
6 6 Yes kkkk
Run Code Online (Sandbox Code Playgroud)
2.或者你可以得到COLA每个值的计数并比较它以查看是否有重复...
select a.colA, a.colb, a.colc,
(case when (select count(*) from test_repeat t where t.cola = a.colA) > 1
then 'Yes'
else 'No'
end) Repeat
from test_repeat a
where colA = colB
/
COLA COLB COLC REP
---------- ---------- -------------------- ---
1 1 aaa Yes
2 2 dddd No
3 3 eeee Yes
4 4 iiii No
5 5 jjjj No
6 6 kkkk Yes
Run Code Online (Sandbox Code Playgroud)
它们都同样简单,但我建议采用分析函数方法,因为我发现它对于我过去使用过的所有查询通常都更快.