计算佣金

时间:2011-01-28 16:35:33

标签: mysql mysql-error-1054 mysql-error-1111

我试图计算每月初支付给客户的佣金(假设他们的佣金超过25英镑)。

这是SQL:

SELECT  SUM(invoiceCommision) as totalSum
FROM    tbl_statement_items
WHERE   fk_rid = '1'
  AND   dt > DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
  AND   totalSum > 25;

但是当我运行它时,mysql说:1054 - 'where子句'中的未知列'totalSum'。

然后我尝试了

SELECT  *
FROM    tbl_statement_items
WHERE   fk_rid = '1'
  AND   dt > DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
  AND   SUM(invoiceCommision) > 25;

这给了我错误:1111 - 无效使用群组功能。

我对此感到难过,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

对于您的第一次尝试,它不起作用,因为您不能在WHERE子句的SELECT子句中使用计算字段(在计算字段之前处理WHERE)。

对于第二次尝试,它不起作用,因为您不能在WHERE子句中使用聚合函数。再次,只是坚持你的第一次尝试,但改变WHERE到HAVING。

还有一个更普遍的问题,即您的SUM()函数将只获取所有语句项的总和,而您希望每个客户端使用它。您可以使用GROUP BY获取每个客户端的总和列表,并使用HAVING子句仅返回总和大于25的那些。

尝试此操作(将client_id更改为实际的内容):

SELECT client_id, SUM(invoiceCommision) as totalSum
FROM tbl_statement_items
WHERE fk_rid = '1' AND dt > DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
GROUP BY client_id
HAVING totalSum > 25;

答案 1 :(得分:0)

在使用SUM

等分组功能时,您需要告诉MySQL如何对数据进行分组

我希望你需要这样的东西:

SELECT *, SUM(invoiceCommision) as commisionSum
FROM tbl_statement_items 
WHERE fk_rid = '1' 
    AND dt > DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
GROUP BY fk_rid 
HAVING commisionSum > 25;

当您需要基于HAVINGGROUP等基于SUM的条件时,您必须使用MAX功能