Sql 查询以筛选具有相同非主键值的行,然后从Oracle中的结果中排除具有另一个空列的记录

Sql 查询以筛选具有相同非主键值的行,然后从Oracle中的结果中排除具有另一个空列的记录,sql,oracle,Sql,Oracle,表Mytable的示例数据 +----------+--------+----------+ | BPT | BC | ST | +----------+--------+----------+ | NH | AB360 | PTOTST | | MEMODMHF | AAAAA | PTOTST | | NH | | PTOTST | | NH | ABH6G | PTOTSTCH | | NH

表Mytable的示例数据

+----------+--------+----------+
|   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     |
+-----+-------+----------+