MySQL SUM()给出了错误的总计


MySQL SUM() giving incorrect total

我正在开发一个php/mysql数据库。我有两张桌子——事项和行动。在其他字段中,matter表包含"matterrid"、"fixedfeee"answers"fee"。固定费用是Y或N,费用可以是任何数字。

对于任何事情,都可能有许多行动。操作表包含"actionid"matterid"advicetime"advice fee"。advicetime是建议持续的时间(以十进制格式),advicefee是一个数字。因此,为了计算某件事的建议成本,我使用SUM(advicetime*advicefee)。

我想做的是将"fixedfeee"=Y时的所有"fee"值以及所有这些事项的所有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 

但这不起作用,因为我认为它似乎错过了任何相同的费用(还有几个事项有相同的固定费用)。

我对这方面还很陌生,所以任何帮助都是非常受欢迎的。

但这不起作用,因为(我认为)这是在把事情加起来。我也试着让它。。。

您正在经历aggregate fanout issue。每当选择查询中的主表的行数少于它所联接的辅助表的行时,就会发生这种情况。联接导致重复的行。因此,当应用聚合函数时,它们作用于额外的行。

这里的主表指的是应用聚合函数的表。在您的示例中,
*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'

CCD_ 8&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