2012-03-30 2 views
1

이렇게 쿼리를 작성했습니다. 그것은 내가 원하는 결과를주고 일하고 있습니다.
CAR_AMOUNTHOTEL_AMOUNT을 얻으려면 SELECT 쿼리가 있습니다.
그러나 동일한 SELECT 쿼리를 모두 수행하여 SUM을 가져와야합니다. 별칭 이름을 사용할 수 없습니다. 어떻게 이것을 피할 수 있습니까?SELECT 하위 쿼리를 반복하지 않고이 쿼리를 다시 작성하는 방법

SELECT B.EMPLOYEE_ID, 
     (select SUM(AMOUNT) 
     FROM travel_reimbursements_items 
     WHERE type = 'CAR' 
     AND travel_request_no = B.travel_request_no 
     AND STATUS='APPROVED') as CAR_AMOUNT, 
     (select SUM(AMOUNT) 
     FROM travel_reimbursements_items 
     WHERE type = 'HOTEL' 
     AND travel_request_no = B.travel_request_no 
     AND STATUS='APPROVED') as HOTEL_AMOUNT, 
     NVL((select SUM(AMOUNT) 
      FROM travel_reimbursements_items 
      WHERE type = 'CAR' 
      AND travel_request_no = B.travel_request_no 
      AND STATUS='APPROVED'),0) 
     +NVL((select SUM(AMOUNT) 
      FROM travel_reimbursements_items 
      WHERE type = 'HOTEL' 
      AND travel_request_no = B.travel_request_no 
      AND STATUS='APPROVED'),0) as TOTAL 
FROM TRAVEL_REQUEST_ITEM A 
    LEFT OUTER JOIN TRAVEL_REQUEST B 
     ON (B.TRAVEL_REQUEST_NO= A.TRAVEL_REQUEST_SR_NO) 
+2

SQL의 어떤 맛? SQL Server, Oracle ...? – Fionnuala

+0

죄송합니다 ... 오라클을 언급하는 것을 잊어 버렸습니다. ... – Andromeda

+0

어플 리케이션 레벨에서 합계를 만들어 보시지 않으시겠습니까? –

답변

3

이것은 oracle에서 작동합니다.

SELECT B.EMPLOYEE_ID, 
      SUM(CASE WHEN C.type = 'CAR' and C.STATUS='APPROVED' THEN C.AMOUNT ELSE 0 END) as CAR_AMOUNT, 
      SUM(CASE WHEN C.type = 'HOTEL' and C.STATUS='APPROVED' THEN C.AMOUNT ELSE 0 END) as HOTEL_AMOUNT, 
      SUM(CASE WHEN C.type IN ('CAR', 'HOTEL') and C.STATUS='APPROVED' THEN C.AMOUNT ELSE 0 END) as TOTAL 
FROM TRAVEL_REQUEST_ITEM A 
    LEFT OUTER JOIN TRAVEL_REQUEST B ON (B.TRAVEL_REQUEST_NO= A.TRAVEL_REQUEST_SR_NO) 
    LEFT OUTER JOIN TRAVEL_REIMBURSEMENTS_ITEMS C ON (C.TRAVEL_REQUEST_NO = A.TRAVEL_REQUEST_SR_NO) 
GROUP BY B.EMPLOYEE_ID 

항목 유형에 따라 조건부 합계 만하면됩니다.

+1

GROUP BY가 누락되었습니다. –

+0

감사합니다. –

+0

다른 선택 쿼리를 사용하여 더 많은 열을 추가하려는 경우이 기능이 작동하지 않습니다. – Andromeda

6
select b.employee_id 
    , sum(case when c.type = 'CAR' then c.amount end) car_amount 
    , sum(case when c.type = 'HOTEL' then c.amount end) hotel_amount 
    , sum(c.amount) total 
    from travel_request_item a 
     left outer join travel_request b 
     on (b.travel_request_no= a.travel_request_sr_no) 
     left outer join travel_reimbursements_items c 
     on ( c.travel_request_no = b.travel_request_no 
      and c.type in ('CAR','HOTEL') 
      and c.status = 'APPROVED' 
      ) 
group by b.employee_id 

감사합니다,
롭.

+0

+1 CASE 문 대신 JOIN에 공유 조건을 넣는 것을 좋아합니다. –

+0

다른 select 쿼리를 사용하여 더 많은 열을 추가하려는 경우이 기능이 작동하지 않습니다 ... – Andromeda

+1

"What columns?"로 시작하는 N West의 멋진 의견보기. –

관련 문제