不带分组依据的Oracle SQL

时间:2019-06-07 15:02:15

标签: sql group-by

我们有一个表partners,我想要一个sql语句,该语句将根据下面的示例数据返回第5行和第6行。逻辑是每个partner2都会有一个默认值partner1,该默认值由字段XDFREL标识,值为X

在某些情况下,XDFREL的填充数量超过1,例如第5行和第6行的partner1 = 08021262。我需要该表中的所有记录(而不是计数),其中XDFREL更大每partner2中有1个以上。结果的一个示例是它将返回第5行和第6行的记录...因为partner2 08021262partner1字段中有两个记录,其中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 :(得分:0)

考虑将汇总查询重新加入单位级别:

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)

答案 1 :(得分:0)

您可以使用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
)