2012-11-25 2 views
0

각 직원의 총 보류 금액을 얻으려고합니다.1242 - 부속 조회에서 부속 조회가 1 행 이상을 리턴합니다.

SELECT SUM(amount) 
FROM pending 
WHERE MONTH < DATE_SUB(curdate() , INTERVAL 1 MONTH) 
GROUP BY class 

을하지만 하위 쿼리로 추가하려고 할 때 그것은 아래에 나에게 오류를 제공합니다 : 아래의 쿼리는 잘 작동

1242 - 하위 쿼리는 1 개 이상의 행

SELECT 
    (period_diff(date_format(now(), '%Y%m'), 
    date_format(MONTH, '%Y%m'))) AS months, 
    pending.amount, 
    pending.admission_numb, 
    pending.month, 
    staff.name, 
    staff.class, (
    SELECT SUM(amount) 
    FROM pending 
    WHERE MONTH < DATE_SUB(curdate(), INTERVAL 1 MONTH) 
    GROUP BY class 
) 
FROM 
    pending JOIN staff 
    ON pending.admission_numb = staff.admission 
GROUP BY admission 
ORDER BY CAST(staff.class AS UNSIGNED) , staff.class 
을 반환

어떤 도움을 받으실 수 있습니다 ..

답변

1

는 :

SELECT 
    (period_diff(date_format(now(), '%Y%m'), date_format(MONTH, '%Y%m'))) AS months, 
    pending.amount, 
    pending.admission_numb, 
    pending.month, 
    staff.name, 
    staff.class, 
    sums.tot 
FROM 
    pending JOIN staff ON pending.admission_numb = staff.admission 
    JOIN (
    SELECT class, SUM(amount) as tot 
    FROM pending 
    WHERE MONTH < DATE_SUB(curdate(), INTERVAL 1 MONTH) 
    GROUP BY class 
) sums on staff.class = sums.class 
GROUP BY admission 
ORDER BY CAST(staff.class AS UNSIGNED) , staff.class 
+0

감사 짝 ... 완벽하게 작동 :) – LiveEn

0

정말 간단합니다. 하위 쿼리는 한 행만 반환 할 수 있습니다. 그것이 오류 메시지가 말하는 것입니다. 가장 많이 보낸 쿼리는 두 개 이상의 행을 반환합니다 (실제로 각 클래스에 하나씩). 당신이 출력을 제공하지 않기 때문에, 나는 이것이 사실 일 뿐이라고 추측 할 수 있습니다.

수정하려면 하나의 행을 반환하도록 쿼리를 변경해야합니다. 아마도 GROUP BY을 없애거나 가장 큰 (또는 가장 작은) 합을 선택하여 반환 할 것입니다. 비즈니스 요구 사항에 따라 결정됩니다. 귀하의 하위 쿼리가 하나 개 이상의 행을 (내가 그것을 각 클래스에 대한 행을 반환 할 것으로 예상), 당신이 절에서 귀하의 하위 쿼리에 가입 할 필요가 반환 이후

관련 문제