Sql 查询以筛选具有相同非主键值的行,然后从Oracle中的结果中排除具有另一个空列的记录
表Mytable的示例数据Sql 查询以筛选具有相同非主键值的行,然后从Oracle中的结果中排除具有另一个空列的记录,sql,oracle,Sql,Oracle,表Mytable的示例数据 +----------+--------+----------+ | BPT | BC | ST | +----------+--------+----------+ | NH | AB360 | PTOTST | | MEMODMHF | AAAAA | PTOTST | | NH | | PTOTST | | NH | ABH6G | PTOTSTCH | | NH
+----------+--------+----------+
| BPT | BC | ST |
+----------+--------+----------+
| NH | AB360 | PTOTST |
| MEMODMHF | AAAAA | PTOTST |
| NH | | PTOTST |
| NH | ABH6G | PTOTSTCH |
| NH | | PT01 |
| NH | ABH6G | PT04 |
| NH | | PT04 |
+----------+--------+----------+
带NH值的BPT柱上的过滤器
+------+--------+----------+
| BPT | BC | ST |
+------+--------+----------+
| NH | AB360 | PTOTST |
| NH | | PTOTST |
| NH | ABH6G | PTOTSTCH |
| NH | | PT01 |
| NH | ABH6G | PT04 |
| NH | | PT04 |
+------+--------+----------+
值为空或ABH6G的BC列上的筛选器
+------+--------+----------+
| BPT | BC | ST |
+------+--------+----------+
| NH | | PTOTST |
| NH | ABH6G | PTOTSTCH |
| NH | | PT01 |
| NH | ABH6G | PT04 |
| NH | | PT04 |
+------+--------+----------+
对于重复的ST,排除BC为空的记录
+------+--------+----------+
| BPT | BC | ST |
+------+--------+----------+
| NH | | PTOTST |
| NH | ABH6G | PTOTSTCH |
| NH | | PT01 |
| NH | ABH6G | PT04 |
+------+--------+----------+
我下面提到的示例查询不起作用。如何实现这一点
SELECT
T1.BPT,
T1.BC,
T1.ST
FROM Mytable T1,
Mytable T2
WHERE T1.BEN_PROD_TYP_CD IN ('NH')
AND ((T1.ST = T2.ST
AND T1.BC = 'ABH6G')
OR (T1.ST <> T2.ST
AND (T1.BC = 'ABH6G'
OR T1.BC IS NULL)));
我认为没有必要为您的要求自行加入
SELECT DISTINCT
T1.BPT,
T1.BC,
T1.ST
FROM Mytable T1
WHERE T1.BPT IN ('NH')
AND (T1.BC = 'ABH6G'
OR T1.BC IS NULL);
问候,,
例如,萨拉瓦南
with
d as (select bpt, bc, coalesce(bc, '<<spaces>>') bcc, st from MyTable),
m as (select bcc from d group by bcc having count(*) > 1)
select d.bpt, max(d.bc) bc, d.st
from d, m
where d.bpt = 'NH'
and d.bcc = m.bcc
group by st, bpt
请尝试以下示例:
Select * from [Mytable]
Where BPT = 'NH' and BC = 'ABH6G'
union
Select * from [Mytable]
Where BPT = 'NH' and BC = ''
And BPT+BC+ST not in (select BPT + '' + ST from [Mytable]
Where BPT = 'NH' and BC = 'ABH6G')
实现该结果的一种方法是使用row_编号: 结果:
请以格式化文本而不是图像的形式共享您的示例数据。如果有人以图片的形式分享他的答案,你会怎么做?请阅读,接受的答案空格和null是两个不同的东西。你确定这个问题在说空格时是空的吗?@zarruq为图片感到抱歉。我无法以表格式对stackoverflow中的sql数据进行框架设置。@zarruq我已按照您的建议对表数据进行了框架设置。现在可以删除否决票了,合并可以将null改为空…谢谢你的SQL提琴。我还有其他专栏要找。但我并没有得到一个按表达式分组的错误。”d为select bpt,bc,coalescebc,bcc,st,vcd,vn,vctct from MyTable,m为select bcc from d group by bcc,count*>1 select d.bpt,maxd.bc bc,d.st from d,m其中d.bpt='NH'和d.bcc=m.bcc group by st by st,bpt'这个查询对我很有效。stackoverflow中是否有格式化表数据的代码提示是的,有很多方法。e、 g.使用格式化表格,将数据复制到SO问题,然后单击{}即代码块:-@Archana另一个固定表格生成器正在生成
select t.BPT, t.BC, t.ST from
(
select t1.*, row_number() over(partition by st order by BC asc) as rn
from MyTable t1
where t1.BPT = 'NH'
and (t1.BC = 'ABH6G' or t1.BC is null)
) t
where t.rn = 1
+-----+-------+----------+
| BPT | BC | ST |
+-----+-------+----------+
| NH | NULL | PTOTST |
| NH | ABH6G | PTOTSTCH |
| NH | NULL | PT01 |
| NH | ABH6G | PT04 |
+-----+-------+----------+