2014-11-28 3 views
1

5 개의 테이블에 대한 통계를 만들고 있습니다. 나는 하나의 클라이언트 데이터로 예제를 만들었다.SQL SUM() 하위 쿼리에서 하나의 행만 계산합니다.

대출

id | status 
------------ 
1454 | payed 

지불 일정

id | loan_id | user_client_id 
----------------------------- 
1456 | 1454 | 3113 

payment_schedule_row

id | payment_schedule_id | payment | payment_date 
--------------------------------------------------- 
5013 | 1456    | 32 | 2013-11-06 
5014 | 1456    | 32 | 2013-12-06 
5015 | 1456    | 32 | 2013-01-05 
5016 | 1456    | 32 | 2013-02-04 
5017 | 1456    | 32 | 2013-03-06 
5018 | 1456    | 32 | 2013-04-05 
5019 | 1456    | 32 | 2013-05-05 
5020 | 1456    | 32 | 2013-06-04 
5021 | 1456    | 32 | 2013-07-04 
5022 | 1456    | 32 | 2013-08-03 
5023 | 1456    | 32 | 2013-09-02 
5014 | 1456    | 32 | 2013-10-02 

payment_schedule_cover

id | payment_schedule_id | date | sum 
---------------------------------------------- 
2282 | 1456    | 2013-11-08 | 34 
3054 | 1456    | 2013-12-07 | 40 
3776 | 1456    | 2013-01-04 | 38 
4871 | 1456    | 2013-02-06 | 49 
5954 | 1456    | 2013-03-06 | 40 
7070 | 1456    | 2013-04-25 | 49 
9029 | 1456    | 2013-05-21 | 52 
10377 | 1456    | 2013-06-20 | 30 
10391 | 1456    | 2013-06-21 | 30 
10927 | 1456    | 2013-07-07 | 60 

payment_schedule_delay

id | payment_schedule_row_id | start_date | end_date | delay 
---------------------------------------------------------------- 
1135 | 5013     | 2013-11-07 | 2013-11-08 | 0.07 
1548 | 5014     | 2013-12-07 | 2013-12-07 | 0.03 
2628 | 5016     | 2014-02-05 | 2014-02-06 | 0.01 

그리고 쿼리는 다음 쿼리에 대한

SELECT period, loan_sum, covers, delay 
FROM 
    (SELECT MAX(EXTRACT(YEAR_MONTH FROM psc.date)) AS period, 
    (SELECT SUM(psr2.payment) FROM payment_schedule_row AS psr2 WHERE psr.payment_schedule_id = psr2.payment_schedule_id) AS loan_sum, 
    (SELECT SUM(psc2.sum) FROM payment_schedule_cover AS psc2 WHERE psc.payment_schedule_id = psc2.payment_schedule_id) AS covers, 
    (SELECT SUM(psd2.delay) FROM payment_schedule_delay AS psd2 WHERE psr.id = psd2.payment_schedule_row_id) AS delay 
    FROM loan 
    INNER JOIN payment_schedule AS ps ON ps.loan_id = loan.id 
    INNER JOIN payment_schedule_row AS psr ON psr.payment_schedule_id = ps.id 
    INNER JOIN payment_schedule_cover AS psc ON psc.payment_schedule_id = ps.id 
    WHERE loan.status = 'payed' 
    GROUP BY ps.id) AS sum_by_id 
GROUP BY period 

결과 :

period | loan_sum | covers | delay 
----------------------------------- 
201407 | 384  | 422 | 0.07 

지연을 제외하고 모든 것이 옳습니다. 0.11 (0.07 + 0.03 + 0.01)

그래서 나는 지금 쿼리에서 오류를 찾으려고 노력하고 있습니다. 어쩌면 누군가 내가 잘못하고있는 것을 말해 줄 수 있습니다.

Sqlfiddle 링크 :http://sqlfiddle.com/#!2/21585/2

+0

이 항목을 가져 오기 n a sqlfiddle 그리고 링크 – Matt

+0

먼저 시도하십시오 – Matt

+0

귀하의 쿼리와 동일한 결과가 나옵니다. 자, 한 시간 후에 sqlfiddle에 추가 할 것입니다. – MulOnPomm

답변

0

마침내 MySQL 포럼에서 답변을 얻었습니다. 내 문제를 해결 무슨 대답했다 :

가 ... 문제가있는 ... 서브 쿼리 연산자에 의해

  1. 그룹은 상관 하위 하위 쿼리의 합계 내부 집계가 표시되지 않습니다. 이 합계는 한 단계 이동해야합니다.

  2. 외부 쿼리의 그룹화 기준 그룹에 대한 집계가 없습니다. 그것은 단지 Order로서의 역할을합니다.

  3. select a, b, c와 같은 질의 (a)는 a와 a 사이에 엄격한 1 : 1 관계가 성립하지 않는 한 b와 c에 대해 임의의 결과를 반환 할 수 있습니다. 각각의 b 및 c는 하위 쿼리에서 대소 문자가 아닌 것처럼 보입니다.

  4. 상관 하위 쿼리는 당신이 자신의 두 단계로 설명으로, 비효율적

  5. delay 상관 하위 쿼리는

그래서 FROM 절에 상관 하위 쿼리 논리를 이동 아무것도

에 참여하지 않는 조인 delay 쿼리에 가입하고 Group By 절을 터치하면 다음과 같은 결과가 나타납니다.

select psc.period, psc.sum, psr.payments, sum(psd.delay) as delay 
from loan 
join payment_schedule as ps on ps.loan_id = loan.id 
join(
    select payment_schedule_id, sum(payment) as payments 
    from payment_schedule_row 
    group by payment_schedule_id 
) as psr on psr.payment_schedule_id = ps.id 
join (
    select payment_schedule_id, sum(sum) as sum, max(extract(year_month from date)) as period 
    from payment_schedule_cover 
    group by payment_schedule_id 
) psc on ps.id = psc.payment_schedule_id 
join payment_schedule_row psr2 on ps.id = psr2.payment_schedule_id 
join (
    select payment_schedule_row_id, sum(delay) as delay 
    from payment_schedule_delay 
    group by payment_schedule_row_id 
) as psd on psr2.id = psd.payment_schedule_row_id 
where loan.status = 'payed' 
group by psc.period, psc.sum, psr.payments; 
0
SELECT period, loan_sum, covers, delay 
FROM 
    (SELECT MAX(EXTRACT(YEAR_MONTH FROM psc.date)) AS period, 
    (SELECT SUM(psr2.payment) FROM payment_schedule_row AS psr2 WHERE psr.payment_schedule_id = psr2.payment_schedule_id) AS loan_sum, 
    (SELECT SUM(psc2.sum) FROM payment_schedule_cover AS psc2 WHERE psc.payment_schedule_id = psc2.payment_schedule_id) AS covers, 
    (SELECT SUM(psd2.delay) FROM payment_schedule_delay AS psd2 WHERE psr.id = psd2.payment_schedule_row_id) AS delay 
    FROM loan 
    INNER JOIN payment_schedule AS ps ON ps.loan_id = loan.id 
    INNER JOIN payment_schedule_row AS psr ON psr.payment_schedule_id = ps.id 
    INNER JOIN payment_schedule_cover AS psc ON psc.payment_schedule_id = ps.id 
    INNER JOIN payment_schedule_delay AS psd ON psr.id = psd.payment_schedule_row_id 
    WHERE loan.status = 'payed' 
    GROUP BY ps.id) AS sum_by_id 
GROUP BY period 
+0

아직도 같은 결과가 나왔다 : (그리고 sqlfiddle는 지금 당장 작동하지 않는 것 같다. : 알 수없는 오류가 발생했습니다 : 파일의 조기 끝 : – MulOnPomm

0
SELECT period, loan_sum, covers, delay 
FROM 
    (SELECT MAX(EXTRACT(YEAR_MONTH FROM psc.date)) AS period, 
    (SELECT SUM(psr2.payment) FROM payment_schedule_row AS psr2 WHERE psr.payment_schedule_id = psr2.payment_schedule_id) AS loan_sum, 
    (SELECT SUM(psc2.sum) FROM payment_schedule_cover AS psc2 WHERE psc.payment_schedule_id = psc2.payment_schedule_id) AS covers, 
    (SELECT SUM(psd2.delay) FROM payment_schedule_delay AS psd2 WHERE psr.id IN /* IN operator will allow for multiple values like psr.id IN (5013,5014,5016) */ psd2.payment_schedule_row_id) AS delay 
    FROM loan 
    INNER JOIN payment_schedule AS ps ON ps.loan_id = loan.id 
    INNER JOIN payment_schedule_row AS psr ON psr.payment_schedule_id = ps.id 
    INNER JOIN payment_schedule_cover AS psc ON psc.payment_schedule_id = ps.id 
    WHERE loan.status = 'paid' 
    GROUP BY ps.id) AS sum_by_id 
GROUP BY period 

변경 = 당신이 지연 값을 요약하는 라인에 IN합니다.

+1

좋은 생각 :) 그 중 하나를 생각하지 않았다 – Matt

+0

아직도있어 동일한 결과 : / – MulOnPomm

관련 문제