2012-10-02 66 views
1

我有以下查詢:選擇所有內容和一筆?

select *, sum(hrs.WPTOTT) as "Hours" 
    from mstwmlt 
inner join MSTWMPRD hrs 
    ON hrs.WPOPID = wtopid and hrs.WPTRAN = wtttyp 
     and (wttdte BETWEEN hrs.WPSDTE AND hrs.WPEDTE) 
where (wtwh = ? OR ? = '*ALL') 
    AND (wtopid = ? OR ? = '*ALL') 
    AND (wtttyp = ? OR ? = '*ALL') 
    and ((wtco|| '/' || wtdiv) = ?) 
order by wttdte, wtopid, wtttme, wtttyp 

,我需要選擇一切的總和,是有辦法做到這一點沒有寫很長的選擇查詢爲每個單獨的領域?

+2

你使用什麼數據庫服務器?這可能會改變你的選擇。 –

回答

1

SUM作爲一個聚合函數,不能在其他列上應用和選擇,而不在這些列上使用GROUP BY

0

在MySQL之外幾乎所有的數據庫,你可以這樣做:

with t as (
    select * 
     from mstwmlt 
    inner join MSTWMPRD hrs 
     ON hrs.WPOPID = wtopid and hrs.WPTRAN = wtttyp 
      and (wttdte BETWEEN hrs.WPSDTE AND hrs.WPEDTE) 
    where (wtwh = ? OR ? = '*ALL') 
     AND (wtopid = ? OR ? = '*ALL') 
     AND (wtttyp = ? OR ? = '*ALL') 
     and ((wtco|| '/' || wtdiv) = ?) 
    ) 
select t.*, 
     (select sum(wpptott) from t) as Hours 
from t 
order by wttdte, wtopid, wtttme, wtttyp 

不幸的是,我懷疑你正在使用MySQL(因爲它是唯一的引擎在您的查詢不會產生編譯時錯誤,由於存在SUM而沒有GROUP BY子句)。在這種情況下,您基本上有三個合理的選項:

  1. 複製原始查詢以獲得總和。在相關子查詢或FROM子句中執行此操作。
  2. 使用ROLLUP獲得另一行的總和。
  3. 在數據庫之外的應用層進行求和。