2012-10-02 3 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이 (사용하는 의심을 당신의 쿼리가 컴파일 시간을 발생하지 않을 수있는 유일한 기관이기 때문에 0x절이없는 SUM이 있기 때문에 오류가 발생했습니다. 이 경우 기본적으로 세 가지 합리적인 옵션이 있습니다.

  1. 합계를 얻으려면 원래 쿼리를 복제하십시오. 상관 하위 쿼리 또는 FROM 절에서이 작업을 수행하십시오.
  2. ROLLUP을 사용하여 다른 행의 합계를 가져옵니다.
  3. 데이터베이스 외부의 응용 프로그램 계층에서 합계를 수행하십시오.
관련 문제