2012-11-25 63 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

由于您的子查询返回多行(我期望它会返回为每个类行),你需要做的from子句投身于你的子查询:

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,或者你选择最大(或最小)的总和并返回。这取决于您的业务需求。

相关问题