我正在开发一个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
但这并不起作用,因为我认为它似乎错过了任何相同的费用(并且有几个问题具有相同的固定费用)。
我对此很新,所以任何帮助都会非常受欢迎。
答案 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
不会使用关键字DISTINCT
。 DISTINCT
仅适用于COUNT
和GROUP_CONCAT
汇总功能。以下是一段无效的SQL
SUM(DISTINCT matters.fee) AS totfixed