如何在不重复SELECT子查询的情况下重写此查询

时间:2012-03-30 12:43:17

标签: sql oracle optimization query-optimization

我写了这样的查询。它正在工作并给我我想要的结果 我有一个SELECT查询来获取CAR_AMOUNTHOTEL_AMOUNT 但是,我必须重复相同的SELECT查询才能获得两者的SUM。我无法使用别名。我怎么能避免这个?

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 个答案:

答案 0 :(得分: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

的问候,
罗布。

答案 1 :(得分: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

根据项目类型进行条件求和。