2011-04-19 5 views
1

Hallo, 내 목표는 소유자에게 속한 각 CODE의 합계를 표시하는 테이블을 생성하는 것입니다. TOTAL 값이 0이더라도 상관없이 각 소유자는 CODE를 묶어야합니다. 그래서 APP, REJ, CAN이 각각 APPROVAL_ID에 묶여있을 것입니다.왜 외부 조인 쿼리가 작동하지 않습니까?

select approval_id, code, total 
from (
    select 'APP' code, '1' seq from dual 
    union all 
    select 'REJ' code, '2' seq from dual 
    union all 
    select 'CAN' code, '3' seq from dual 
) 
left outer join (
     select m.approval_id, own.name, m.decision, count(*) total, 
     case own.channel 
      when 'CH1' then 'CH1' 
      when 'CH2' then 'CH2' 
      else 'Others Channel' 
     end the_channel 
     from tableM m, owner own 
     where m.decision in ('REJ', 'APP', 'CAN') 
     and own.id=m.approval_id 
     group by m.approval_id, own.name, m.decision, own.channel 
     order by m.approval_id 
) 
on code=decision 
group by approval_id, code, total 
order by approval_id; 

상기 질의로부터의 출력은 다음과 같다 :

APPROVAL_ID CODE TOTAL 
----------- ---- ----- 
101   APP 2 
101   REJ 1 
101   CAN 3 
102   APP 2 
102   REJ 4 
103   CAN 4 

내부 쿼리의 출력은 다음과 같다 :

따라서
APPROVAL_ID CODE TOTAL 
----------- ---- ----- 
101   APP 2 
101   REJ 1 
101   CAN 3 
102   APP 2 
102   REJ 4 
102   CAN 0 
103   APP 0 
103   REJ 0 
103   CAN 4 

여기 소스 코드

APPROVAL_ID CODE TOTAL 
----------- ---- ----- 
101   APP 2 
101   REJ 1 
101   CAN 3 
102   APP 2 
102   REJ 4 
103   CAN 4 

Something w 행의 일부가 0의 전체 값을 가짐을 알고 있기 때문에 쿼리에 맞지 않기 때문에 (null) 값을 출력해야합니다. 그런데 왜 그것이 시야에 숨겨져 있습니까? 내 쿼리에 문제가 있습니까?

THanks @!

+0

해야한다는 것입니다? 'CH1'을 입력 한 다음 'CH2'를 누른 다음 'CH2'를 입력하면 'm.approval_id, own.name, m.decision, count (*) total, case own.channel을 선택하십시오. else'기타 채널 '은 tableM에서 the_channel을 종료합니다. m.approval_id, staff.staff_name, m.decision, own.channel order by m에 의해 ('REJ', 'APP', 'CAN') 및 own.id = m.approval_id 그룹의 m.decision이있는 소유자 자신. approval_id) – forsvarir

+0

@forsvarir 내부 쿼리의 결과를 추가했습니다. 이는 상위 출력과 정확히 같습니다. – huahsin68

+0

내부 쿼리의 staff.staff_name은 무엇입니까? –

답변

1

먼저 소유자와 코드 테이블간에 교차 결합을 수행해야합니다. 그런 다음 왼쪽 조인을 수행합니다.

저는 3 개의 테이블을 모델링했습니다 : APP, REJ 및 CAN의 3 행을 입력 한 다음 소유주 테이블과 동일한 사용자 테이블과 tableM과 동일한 세 번째 테이블 결정을 입력하십시오.

쿼리는 다음과 같습니다

SELECT c.user_id, c.type_code, COUNT(d.id) 
FROM 
(

    SELECT t.ID as type_id, u.id as user_id, t.CODE as type_code 
    FROM Type t, Userr u 
) c 
    LEFT OUTER JOIN Decision d 
      ON d.user_id = c.user_id 
      AND d.type_id = c.type_id 
GROUP BY c.user_id, c.type_code 

테스트하지만, 테이블 세트 당신을 위해하지 : 계수 (m.approval_id가) 당신에게 approval_id의 수를 줄 것이다

select a.id_own, a.code, count(m.approval_id) 
from 
    (
     select code, own.id as id_own 
     from (
      select 'APP' code, '1' seq from dual 
      union all 
      select 'REJ' code, '2' seq from dual 
      union all 
      select 'CAN' code, '3' seq from dual 
     ) , owner own 
    ) a 
    left outer join tableM m 
on a.code = m.decision 
and a.id_own = m.approval_id 
group by a.id_own, a.code 
order by a.id_own 

참고 왼쪽 조인에 null이 아닌 것으로 표시됩니다.

+0

알고리즘이 너무 완벽합니다! 나는 너에게서 새로운 기술을 배웠다 : 0) – huahsin68

1

외부 조인은 코드 = 결정에 있습니다. 즉, 오른쪽에 결정으로 발생하지 않는 코드마다 하나의 행을 가져옵니다. 분명히 왼쪽에 코드와 APPROVAL_ID의 모든 조합을 제공하는 3 개의 코드와 모든 고유 한 APPROVAL_ID의 교차 결합으로 왼쪽 결합을 수행하려고합니다.

0

내 첫번째 추측은

group by approval_id, code, total 

는 내부 쿼리 수익을 무엇

group by approval_id, code 
관련 문제