2017-12-11 3 views
0

현재 여러 행의 데이터를 반환하는 쿼리가 있습니다. 비즈니스 요구 사항을 충족하는지 여부를 확인하기 위해 PL/SQL 및/또는 SQL을 사용하여이 데이터를 분석해야합니다 (TRUE 또는 FALSE).Oracle SQL/PLSQL : 여러 조건이 여러 데이터 행에서 충족 될 때 부울 값을 반환합니다.

Sample Data 1     Sample Data 2    Sample Data 3 

TYPE  STATUS   TYPE  STATUS   TYPE  STATUS 
Red   Open    Red   Open   Red   Open 
Blue  Open    Blue  Open   Blue  Open 
Yellow  Open    Yellow  Open   Yellow  Open 
Red   Closed   Yellow  Closed 
Red   Pending 

요구 사항 - 그렇지 않으면 FALSE 만난 반환 TRUE는 경우 :

각 TYPE의 상태가 '열기'해야합니다.

동일한 TYPE에 대해 두 개 이상의 레코드가있는 경우 최소한 하나의 레코드에 대한 STATUS가 '열기'여야하며 나머지 레코드에 대한 STATUS는 'Closed'여야합니다. 위의 요구 사항에 따라

결과 :이 질문은 중복 인 경우

Sample Data 1 = FALSE 
Sample Data 2 = TRUE 
Sample Data 3 = TRUE 

모든 모든 훨씬, 사과를 감사 도움이됩니다.

답변

1

오라클 SQL 부울 유형이, 그래서 사용하지 않는 0과 1 :

select type, 
     (case when count(distinct case when status = 'open' then type end) = count(distinct type) and 
        count(case when status = 'open' then type end) = count(distinct type) and 
        sum(case when status not in ('open', 'closed') then 1 else 0 end) = 0     
      then 1 else 0 
     end) as flag 
from t 
group by type; 

논리 :

  • 첫 번째 조건은 각 type 적어도 하나의 "개방"을 가지고 있다고 .
  • 첫 번째 조건과 결합 된 두 번째 조건은 각 type에 정확히 하나의 "열린"단어가 있음을 나타냅니다.
  • 세 번째 조건은 유일한 상태가 "열림"및 "닫힘"이라고 말합니다.
+0

Oracle PL/SQL에는 부울 데이터 형식이 있지만 SQL 솔루션을 제공 했으므로이 컨텍스트에서는 아무런 차이가 없습니다. – pwl

+0

또한 두 번째 논리 행이 잘못되었습니다. 'count (status ='open 'then end end) = count (distinct type) 및'- 두 번째 요구 사항은 적어도 하나의 상태가'Open '이어야한다고 말합니다. 하나만 말해봐. – pwl

관련 문제