MySQL SUM()给出的总数不正确

时间:2015-03-31 23:15:13

标签: php mysql

我正在开发一个php / mysql数据库。我有两张桌子 - 事情和行动。 在其他领域中,问题表包含“问题”。 ' fixedfee'和'费用'固定费用是Y或N,费用可以是任何数字。

对于任何事情,可以有许多行动。动作表包含' actionid' ' matterid' ' advicetime' ' advicefee&#39 ;.建议时间是建议的持续时间(以十进制格式表示),而advicefee是一个数字。因此,为了解决问题的建议成本,我使用SUM(advicetime * advicefee)。

我想要做的是将所有费用加起来'当&fixed;' = Y时的值以及所有这些事项的所有SUM(advicetime * advicefee)值的总和。

我尝试过使用:

SELECT
        SUM(matters.fee) AS totfixed,
        SUM(advicetime*advicefee) AS totbills,
    FROM matters
    INNER JOIN actions
        ON matters.matterid = actions.matterid
    WHERE fixedfee = 'Y'

但这并不起作用(我认为)它会在每次有动作时加起来。我也尝试过制作

SUM(DISTINCT matters.fee) AS totfixed 

但这并不起作用,因为我认为它似乎错过了任何相同的费用(并且有几个问题具有相同的固定费用)。

我对此很新,所以任何帮助都会非常受欢迎。

1 个答案:

答案 0 :(得分:1)

  

但这不起作用(我认为)它会在每次有动作时加上材料。我也尝试过制作它......

您遇到aggregate fanout issue。只要select查询中的主表的行数少于它所连接的辅助表,就会发生这种情况。连接导致重复的行。因此,当应用聚合函数时,它们会作用于额外的行。

这里主表指的是应用聚合函数的表。在你的例子中,
* SUM(matters.fee)>>表格matters上的汇总。
* SUM(advicetime*advicefee)>>表格actions上的汇总 * fixedfee='Y'>>表格matters

的条件

避免扇出问题:
*始终将聚合应用于联接中最精细的表 *除非两个表具有一对一的关系,否则不要对两个表的字段应用聚合函数 *通过不同的子查询分别获取聚合,然后合并结果。这可以在SQL语句中完成,也可以导出数据然后执行。

查询1:

SELECT SUM(fee) AS totfixed 
FROM matters 
WHERE fixedfee='Y'

查询2:

SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
FROM matters  
JOIN actions ON matters.matterid = actions.matterid 
WHERE matters.fixedfee = 'Y'

Query 1& Query 2不会受到粉丝的影响。此时你可以导出它们并在php中处理结果。或者您可以在SQL中组合它们:

SELECT query_2.totbills, query_1.totfixed
FROM (SELECT SUM(fee) AS totfixed 
    FROM matters 
    WHERE fixedfee='Y') query_1,

    (SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
    FROM matters  
    JOIN actions ON matters.matterid = actions.matterid 
    WHERE matters.fixedfee = 'Y') query_2

最后,SUM不会使用关键字DISTINCTDISTINCT仅适用于COUNTGROUP_CONCAT汇总功能。以下是一段无效的SQL

SUM(DISTINCT matters.fee) AS totfixed
相关问题