2012-12-13 5 views
3

SQL 문과 관련하여 도움이 필요할 수 있습니다. 그때 무게 열을 요약하고 이름하여 그룹화요약 된 열을 누적하십시오.

cont_id  name  weight 
----------- ---------- ----------- 
1   1   10 
2   1   20 
3   2   40 
4   2   15 
5   2   20 
6   3   15 
7   3   40 
8   4   60 
9   5   10 
10   6   5 

:

name  wsum 
---------- ----------- 
2   75 
4   60 
3   55 
1   30 
5   10 
6   5 

그리고이 결과가 축적 된 열이해야하고 그래서 나는 그처럼 보이는 테이블 "계속"가 이 같아야합니다 ..

name  wsum  acc_wsum 
---------- ----------- ------------ 
2   75   75 
4   60   135 
3   55   190 
1   30   220 
5   10   230 
6   5   235 

하지만 작업을 마지막으로 문을 얻기 위해 관리하지 않았다

편집 :이 문은 그것을했다 (덕분에 고든)

select t.*, 
    (select sum(wsum) from (select name, SUM(weight) wsum 
    from cont 
    group by name) 
    t2 where t2.wsum > t.wsum or (t2.wsum = t.wsum and t2.name <= t.name)) as acc_wsum 
from (select name, SUM(weight) wsum 
from cont 
group by name) t 
order by wsum desc 
+0

작동하지 않을 수있는 진술의 코드를 표시하십시오. 또한, 어떤 데이터베이스를 사용하고 있습니까? – dan1111

+0

난 그냥 [이 답변] (http://stackoverflow.com/a/2563940/1771479) MySQL을 위해 정말 잘 작동 발견. – agold

답변

3

, 가장 좋은 방법은이 하위 쿼리 할 사용하는 가입하실 수 있습니다 누적 합계를 사용 중입니다.

select t.*, 
     sum(wsum) over (order by wsum desc) as acc_wsum 
from (<your summarized query>) t 

order by 절이 누적됩니다.

select t.*, 
     (select sum(wsum) from (<your summarized query>) t2 where t2.wsum >= t.wsum) as acc_wsum 
from (<your summarized query>) t 

이 작동합니다 :

당신이 (SQL 서버 2012와 오라클에서) 그 능력이없는 경우, 상관 하위 쿼리는 합계 중량을 가정 그것을 할 수있는 쉬운 방법이있다는 별개의 값입니다 SQL의 모든 방언에서. 누적 가중치가 중복 된 상황에서 작업하려면

select t.*, 
     (select sum(wsum) from (<your summarized query>) t2 where t2.wsum > t.wsum or (t2.wsum = t.wsum and t2.name <= t.name) as acc_wsum 
from (<your summarized query>) t 
+0

뷰, 인라인 함수, 파생 테이블에서 순서가 잘못되었다는 오류가 발생합니다. 그리고 나가면 't'개체가 유효하지 않습니다. t를 선택 – 65756C626F74

+0

. * 이름을 대륙 \t 그룹 ( \t 선택 이름, SUM (중량) wsum \t에서 acc_wsum 등 (t T2에서의 합 (wsum)를 t2.name <= t.name 선택) ) t – 65756C626F74

+1

@UlrichFischer. . . 내 사과. 't'는 요약 쿼리를 ​​의미했습니다. 대부분의 데이터베이스 (MySQL 제외)에서는 CTE를 사용하여이를 표현할 수 있으며 쿼리에 한 번만 포함하면됩니다. –

0

;WITH CTE 
AS 
(
SELECT *, 
ROW_NUMBER() OVER(ORDER BY wsum) rownum 
FROM @table1 
) 
SELECT 
c1.name, 
c1.wsum, 
acc_wsum= (SELECT SUM(c2.wsum) 
        FROM cte c2 
        WHERE c2.rownum <= c1.rownum) 
FROM CTE c1; 

을 시도하거나 대신

;WITH CTE 
AS 
(
SELECT *, 
ROW_NUMBER() OVER(ORDER BY usercount) rownum 
FROM @table1 
) 
SELECT 
c1.name, 
c1.wsum, 
acc_wsum= SUM(c2.wsum) 
FROM CTE c1 
INNER JOIN CTE c2 ON c2.rownum <= c1.rownum 
GROUP BY c1.name, c1.wsum; 
그래서
+0

나는 공통 테이블 식을 한번도 사용하지 않았습니다. 코드를 'cont'라는 테이블 이름으로 조정할 수 있습니까? – 65756C626F74