Oracle SQL с группой без учета - PullRequest
0 голосов
/ 07 июня 2019

У нас есть таблица partners, и я хотел SQL-оператор, который будет возвращать строки 5 и 6 на основе данных примера ниже. Логика заключается в том, что каждый partner2 будет иметь по умолчанию один partner1, который определяется полем XDFREL, имеющим значение X.

В некоторых случаях XDFREL имеет более 1 заполненного, например, для partner1 = 08021262 в строках 5 и 6. Мне нужны все записи из этой таблицы (не считая), где XDFREL больше 1 для каждого partner2. Примером результата является то, что он будет возвращать записи из строк 5 и 6 ... потому что partner2 08021262 имеет две записи в поле partner1, где XDFREL имеет заполненный X.

Заранее спасибо

No| Partner1|   Partner2|   DateFrom|   DateTo    | XDFREL
01| 07380858|   08021262|   2/1/2018|   12/31/9999| 
02| 07342746|   08021262|   2/1/2017|   12/31/9999| 
03| 07342744|   08021262|   8/7/2017|   12/31/9999| 
04| 07340195|   08021262|   5/4/2017|   12/31/9999| 
05| 07100325|   08021262|   1/1/2001|   12/31/9999| X
06| 07073790|   08021262|   2/1/2017|   12/31/9999| X
07| 07517785|   08427151|   8/7/2017|   12/31/9999| X
08| 07517786|   08427152|   8/8/2017|   12/31/9999| X
09| 07517787|   08427152|   8/8/2017|   12/31/9999|

Я могу получить счет, но мне нужно фактическое значение partner1

select count(B5.PARTNER1), B5.PARTNER2
from partners B5 
where B5.XDFREL = 'X' 
and TO_DATE(B5.DATE_TO , 'YYYYMMDD') > TRUNC(sysdate)
group by  B5.PARTNER2
having count(B5.PARTNER1) > 1

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Вы можете сделать это с помощью EXISTS:

with cte as (
  select *
  from partners 
  where XDFREL = 'X' and TO_DATE(DATE_TO , 'YYYYMMDD') > TRUNC(sysdate)
)
select c.*
from cte c 
where exists (
  select 1 from cte
  where partner2 = c.partner2 and partner1 <> c.partner1
)
0 голосов
/ 08 июня 2019

Рассмотрите возможность присоединения агрегатного запроса к уровню блока:

with agg AS (
   select count(B5.PARTNER1), B5.PARTNER2
   from partners B5 
   where B5.XDFREL = 'X' 
     and TO_DATE(B5.DATE_TO, 'YYYYMMDD') > TRUNC(sysdate)
   group by B5.PARTNER2
   having count(B5.PARTNER1) > 1
)

select p.PARTNER1, p.PARTNER2, P.DATE_TO
from partners p
inner join agg
   on p.PARTNER2 = agg.PARTNER2
  and p.XDFREL = 'X' 
  and TO_DATE(p.DATE_TO, 'YYYYMMDD') > TRUNC(sysdate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...