2012-07-26 3 views
-1

가능한 중복 :
Calculate a Running Total in SqlServer누적 총

내가 MS-SQL 서버의 열 누적 (실행) 총을 얻을 필요가있다. 나는. "Marks"라는 열이 있으면 각 행 누적 합계에 해당하는 현재 행과 이전 행의 합계가됩니다. 조인을 사용하지 않고 결과를 얻을 수 있습니까? 내 쿼리가 꽤 커서 때문입니다. 사전에

SELECT 
    STUDENT_NAME, 
    MARKS, 
    SUM(MARKS) OVER (ORDER BY STUDENT_NAME) CUM_SUM 
FROM SCORE_CHART 
ORDER BY STUDENT_NAME; 

감사합니다 : 그것은 쉽게 오라클에서 enter image description here

같이 쓰기 :

CREATE TABLE "SCORE_CHART" 
    ( 
     "STUDENT_NAME" NVARCHAR(20), 
     "MARKS" INT 
    ) 

INSERT INTO SCORE_CHART (STUDENT_NAME, MARKS) VALUES ('STUD1', 95); 
INSERT INTO SCORE_CHART (STUDENT_NAME, MARKS) VALUES ('STUD2', 90); 
INSERT INTO SCORE_CHART (STUDENT_NAME, MARKS) VALUES ('STUD3', 98); 

SELECT STUDENT_NAME, MARKS FROM SCORE_CHART; 

예상 결과 :

나는 샘플 테이블과 데이터를 포함했다.

+1

예상되는 결과를 볼 수 없습니다 (직장에서 차단됨). 텍스트 기반 예제를 게시 할 수 있습니까? 첫 행 누적 합계에 대한 – Codingo

+0

은 초당 95, 185 및 세 번째 283이어야합니다. – TechDo

답변

0

재귀 적으로 CTE를 사용하십시오.

+0

이 테이블 구조에 대한 쿼리를 게시 할 수 있습니까? – TechDo

+0

답안에 재귀 CTE 전체 예제를 추가했습니다 ... 이해하기 쉬운 구조는 아니지만 (하나를 작성할 때마다 고통이 조금씩 줄어 듭니다!) – whytheq

+0

재귀 CTE로 SQL 쿼리를 확인하십시오. 지금 당장 나는 업로드했습니다. – AnandPhadke

1

당신은 조인이 없다고 말했습니까? ;)

SELECT STUDENT_NAME, MARKS, running.total 
FROM SCORE_CHART a 
cross apply 
(
    select SUM(marks) total 
    from score_chart b 
    where b.student_name <= a.student_name 
) running 
ORDER BY STUDENT_NAME; 

student_name의 색인은 괜찮을 것입니다! 그냥 가입하고

+0

답장을 보내 주셔서 감사합니다. 주어진 데이터에 대해 쿼리가 올바르게 작동합니다. 문제는 제 선택에 3-4 개의 테이블 조인이 포함되어 있기 때문에 CROSS APPLY를 구현하려면 전체 쿼리를 내부 쿼리에 넣어야하며 매우 큰 것처럼 보입니다. 도움에 다시 한번 감사드립니다. – TechDo

0

는 순서를 보장하는 것하지만 최종 답변 확인을 함께 제공하지 않습니다

select 
    x.STUDENT_NAME 
    , sum(y.marks) marks 
from 
    SCORE_CHART x 
     join SCORE_CHART y 
      on x.STUDENT_NAME <= y.STUDENT_NAME 
group by x.STUDENT_NAME 
order by x.STUDENT_NAME 

그냥 NO 규칙을 JOINS 것 - 다시 생각합니다

편집 - 확인을 지금 실행 : LIVE FIDDLE HERE

데이터

CREATE TABLE "SCORE_CHART"  
(    
    "STUDENT_NAME" NVARCHAR(20),   
    "MARKS" INT  
) 
INSERT INTO SCORE_CHART (STUDENT_NAME, MARKS) 
VALUES 
('STUD1', 95), 
('STUD2', 90), 
('STUD3', 98) 
0,123,516 만들기 재귀 CTE를 사용

:

;WITH 
    init_cte(row,STUDENT_NAME,MARKS) 
    AS 
     (
     SELECT 
     ROW_NUMBER() OVER (ORDER BY STUDENT_NAME), 
     STUDENT_NAME, 
     MARKS 
     FROM SCORE_CHART 
     ) 
    ,MinMax_cte(MinRow,MaxRow) AS (SELECT MIN(row),MAX(row) FROM init_cte) 

    ,recursive_cte (row,STUDENT_NAME,MARKS,RUNNING_MARKS) AS 
     (
     SELECT row,STUDENT_NAME,MARKS,MARKS 
      FROM init_cte 
      WHERE row = (SELECT MinRow FROM MinMax_cte) 
     UNION ALL 
     SELECT Y.row,y.STUDENT_NAME,y.MARKS,x.RUNNING_MARKS + y.MARKS 
      FROM recursive_cte x 
      INNER JOIN init_cte y 
       ON y.row = x.row + 1 
      WHERE y.row <= (SELECT [MaxRow] from MinMax_cte) 
    ) 
SELECT * FROM recursive_cte 

당신에게 의견에서 언급 한 바와 같이 영업 이익 샘 사프란 UPDATE를 사용하여 실행중인 총 일을 매우 우아한 방법을 제시 그 질문에 비슷한 질문 HERE ON SO 있다.그냥 같은 테이블에 가입하여

는 누적 합계를 얻을 수 있습니다 :이 시도

CREATE TABLE #t (ROW int, STUDENT_NAME NVARCHAR(20) , MARKS int, MARKS_RUNNING int) 
INSERT INTO #t 
SELECT 
     ROW_NUMBER() OVER (ORDER BY STUDENT_NAME), 
     STUDENT_NAME, 
     MARKS, 
     0 
FROM SCORE_CHART 

DECLARE @total int 
SET @total = 0 
UPDATE #t SET marksrunning = @total, @total = @total + MARKS 

SELECT * FROM #t 
2

: 위에하지만 UPDATE 트릭을 사용하여 만든 동일한 데이터를 사용

:이 데이터에 적용됩니다 자체

SELECT S1.STUDENT_NAME, S1.MARKS ,sum(S2.MARKS) CUM_SUM 
FROM SCORE_CHART S1 join SCORE_CHART S2 
on S1.STUDENT_NAME>=S2.STUDENT_NAME 
group by S1.STUDENT_NAME, S1.MARKS 
order by S1.STUDENT_NAME, S1.MARKS 

SQL Fiddle demo

+0

매우 느립니다. 게시 한 링크 참조 – Madhivanan

1

확인 재귀 CTE의 쿼리

;with CTE as (select ROW_NUMBER() over (order by (select 0)) as id,STUDENT_NAME,MARKS from SCORE_CHART) 
,CTE1 as (

select id,STUDENT_NAME,marks,marks as CUM_SUM from CTE where id=1 
UNION ALL 
select c.id,c.STUDENT_NAME,c.marks,c.marks+c1.CUM_SUM as CUM_SUM from CTE1 c1 inner join CTE c on c.id-1=c1.id) 
select * from CTE1 
+0

귀하의 노력에 감사드립니다. – TechDo

+0

@techdo +1은 일반적인 응답입니다. – whytheq