2012-03-30 142 views
1

我寫過這樣的查詢。它正在工作,並給我我想要的結果。
我有一個SELECT查詢來獲取CAR_AMOUNTHOTEL_AMOUNT
但是,我不得不重複同樣的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 2012-03-30 12:45:50

+0

對不起...忘了提及它..它的Oracle .... – Andromeda 2012-03-30 12:46:46

+0

爲什麼你不在應用程序級別上進行總結,我希望在你的情況下是可能的。 – 2012-03-30 12:47:44

回答

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。 – 2012-03-30 13:00:17

+0

哎呀,謝謝。 – 2012-03-30 13:03:00

+0

這不適合我,因爲我想添加更多的列與不同的選擇查詢 – Andromeda 2012-03-30 13:22:01

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我喜歡把共享條件放入JOIN而不是CASE語句中。 – 2012-03-30 13:07:36

+0

這對我不起作用,因爲我想用不同的選擇查詢添加更多列...... – Andromeda 2012-03-30 13:21:36

+1

請參閱N West以「什麼列?」開頭的偉大評論。 – 2012-03-30 13:42:10