繁体   English   中英

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

[英]MySQL SUM() giving incorrect total

我正在开发一个php / mysql数据库。 我有两个表格-问题和行动。 在其他字段中,问题表包含“杂项”,“ fixedfee”和“ fee”。 固定费用是Y或N,费用可以是任何数字。

无论如何,都可以采取许多措施。 操作表包含“ actionid”,“ matterid”,“ advicetime”,“ advicefee”。 咨询时间是咨询持续的时间(十进制格式),而咨询费是一个数字。 因此,为了计算出建议的成本,我使用了SUM(advicetime * advicefee)。

我希望做的是将“ fixedfee” = 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'

Query 1Query 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不使用关键字DISTINCT DISTINCT仅可用于COUNTGROUP_CONCAT聚合函数。 以下是一段无效的SQL

SUM(DISTINCT matters.fee) AS totfixed

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM