[英]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 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
不使用关键字DISTINCT
。 DISTINCT
仅可用于COUNT
和GROUP_CONCAT
聚合函数。 以下是一段无效的SQL
SUM(DISTINCT matters.fee) AS totfixed
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.