2012-05-27 4 views
0

phpmyadmin을 통해 MySql 데이터베이스를 실행 중이고 일부 값을 합산하기 위해 쿼리를 작성 중입니다. 이 = 같은다시 시작하는 쿼리 실행

Excel에서 화학식 보이는 IF (AND (P6 = P5, B6 = B5), SUM (H5 + F6) F6) 화학식은 H 칼럼에 넣고 있음

P 열은 클래스 식별자입니다. B 열은 등록 번호입니다. H 열은 총점입니다. F 열은 항목의 포인트 값입니다.

뛰어난 성능을 발휘합니다. 하지만 SQL 구문에 문제가 있습니다.

나는 모든 것이 올바른 순서로 전달되도록 파일을 정렬해야한다는 것을 알고있다. 그러나 그 시점에서 나는 우둔합니다.

내 Excel 코드에 대한 자세한 설명이 필요하면 도움이된다면 그렇게 할 수 있습니다.

답변

1

검색에 성능 저하에주의한다. MySql에서 분석 함수를이 데이터베이스에서 사용할 수 없기 때문에 변수를 사용하여 "해킹"을 수행해야합니다.

다음 쿼리를 수행합니다. 그것은 세 개의 변수를 사용하여 - F 열의 저장소 합 @rollingsum, 그리고 @prevP 및 @prevB 변수 B 및 P 컬럼)의 이전 값을 저장

SELECT s.p, s.b, s.f, s.rollingSum FROM 
(
SELECT p, 
     b, 
     f, 
     IF([email protected] AND [email protected], 
     @rollingsum := @rollingsum + f, 
     @rollingsum := f) as rollingSum, 
     @prevP := p, 
     @prevB := b 
FROM  test_table p, (SELECT @rollingsum := 0, @prevP := '', @prevB := '') r 
ORDER BY p,b) s 

예 :

소스 데이터 :

위의 질의에 대한
P B F 
1 1 10 
1 1 10 
1 2 10 
1 2 10 
1 2 10 
2 2 10 
2 2 10 
2 2 10 

결과 (rollingsum 열은 H 열이다 - 엑셀에서 총 포인트) :

P B F ROLLINGSUM 
1 1 10 10 
1 1 10 20 
1 2 10 10 
1 2 10 20 
1 2 10 30 
2 2 10 10 
2 2 10 20 
2 2 10 30 
+0

그것은 완벽 해 보인다! 나는 컴퓨터에서 멀리 떨어져 있지만, 오늘 밤 집에있을 때 나는 그것을 줄 것이다. 정확히 내가 필요로하는 것 같습니다. 고맙습니다! –

+0

좋아요. 내가 바꾸어야 할 유일한 것은 ORDER BY가 가장 먼저 실행되어야 할 필요가 있다고 생각합니다. 이 파일들이 항상 정확한 순서가 아니기 때문입니다. 그리고 나는 rollingsum 값을 total points 열로 설정해야합니다. 여기 내 값으로 보이는 것입니다 : –

+0

SELECT Test.Class_Subset, Test.RegNum, Test.Points, Test.Total_Points, Test.rollingsum, Test.Date_Earned SELECT Class_Subset, Total_Points, RegNum, Points, = rollSum, @prevSub : = Class_Subset, @prevNum : = RegNum 보낸 사람 : Date_Earned, IF (Class_Subset = @prevSub 및 RegNum = @prevNum, @rollingsum : = @rollingsum +'Points', @rollingsum : 테스트 ( SELECT @rollingsum = 0 @prevSub = ', @prevNum =' ) RegNum, Class_Subset, Date_Earned, Total_Points ) 시험에 의해 R ORDER는 –

0

당신은 당신의 테이블 구조에 대해 우리에게 많은 세부 사항을 제공하지 않았다, 그래서 당신이 SOME_ID = 5이 데이터와 SOME_ID = 6 으로 기록이 랬하고, 하나 개의 가능한 SQL 문은 다음과 같습니다

select 
    (select T1.B from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as B_PREVIOUS, 
    (select T1.F from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as F_PREVIOUS, 
    (select T1.H from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as H_PREVIOUS, 
    (select T1.P from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as P_PREVIOUS, 
    B as B_CURRENT, F as F_CURRENT, H as H_CURRENT, P as P_CURRENT, 
    case when 
     (select T1.B from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) = B 
     and 
     (select T1.P from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) = P then 
      (select T1.H from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) + F 
    else 
      F 
    end as RESULT 
from SOME_TABLE 
where SOME_ID = :CURRENT_ID 

물론 반환해야하는 열은 RESULT뿐입니다. 디버깅 목적으로 만 다른 것을 반환합니다.

희망이 도움이됩니다. 편집을 할

: @ 벤를 반영하기 위해 업데이트로 인해 반복적으로 지금까지 내가 당신이 어떤 "파티션"또는 행에 총을 실행 필요가 이해 현재 레코드를

+0

그녀의 e는 내 파일의 스크린 샷입니다. http://nadacforum.com/Points.png 위의 코드가 작동한다고 생각합니다. 유일한 문제는 내가 입력하지 않고 RegNum을 볼 수있는 무언가가 필요하다는 것입니다. 큰 파일은 거의 백만 개의 레코드입니다. –

+0

글쎄, 당신의 문제를 제대로 이해하고 있는지 확실하지 않습니다. 이전 레코드를 참조로 취한 하나의 레코드를 처리해야하는 경우, 아마도 업데이트 된 답변이 예상 결과를 제공 할 것입니다. 어떤 방법 으로든이 솔루션은 한 번에 하나의 ID로 작동합니다. 이전 ID를 동적으로 찾아야하는 경우 "SOME_TABLE (ID <: CURRENT_ID) 또는 그와 유사한 항목에서 SOME_ID = (최대 (ID)를 선택하십시오.) – jfoliveira

+0

OP에서 8 개의 인덱스 스캔을 제안 하시겠습니까? 약간 과장된 것 같습니까? – Ben

관련 문제