Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL获取按用户作业位置分组的余额总和_Mysql_Join_Group By_Left Join - Fatal编程技术网

MySQL获取按用户作业位置分组的余额总和

MySQL获取按用户作业位置分组的余额总和,mysql,join,group-by,left-join,Mysql,Join,Group By,Left Join,我试图得到特定月份所有用户余额的总和,并按用户所在地区分组,这取决于他们工作的销售点 平衡 身份证余额 日期 id\u用户 价值观$$$ 使用者 id\u用户 身份证 姓名不相关 销售点 身份证 id_地区 姓名不相关 地理位置 id_地区 佛罗里达州、德克萨斯州等 基本上,我需要它来显示按月份过滤的数据: location_region.name | SUM(balance.value) ---------------------|------------------- Florida

我试图得到特定月份所有用户余额的总和,并按用户所在地区分组,这取决于他们工作的销售点

平衡

身份证余额 日期 id\u用户 价值观$$$ 使用者

id\u用户 身份证 姓名不相关 销售点

身份证 id_地区 姓名不相关 地理位置

id_地区 佛罗里达州、德克萨斯州等 基本上,我需要它来显示按月份过滤的数据:

location_region.name | SUM(balance.value)
---------------------|-------------------
Florida              | 45730
Texas                | 43995
我尝试过几种方法,但都没有成功。这是我最近的一次尝试

SELECT location_region.name, SUM(balance.value) AS money
FROM balance
LEFT JOIN user ON user.id_user
LEFT JOIN pos ON pos.id_pos = user.id_pos
LEFT JOIN location_region ON location_region.id_region = pos.id_region
WHERE balance.date BETWEEN '2014-02-01' AND DATE_ADD('2014-02-01', INTERVAL 1 MONTH)
GROUP BY location_region.id_region
ORDER BY money DESC

有什么想法吗?谢谢

详细查看表结构和您给出的查询后,我觉得这种不匹配可能会发生,因为连接可能会出现重复的行数。在这种情况下,我的建议是找到不同的行并将其相加,以便得到准确的结果。现在,由于MySQL中没有SUM DISTINCT,您可以尝试这种不同的方法来实现您想要的:

SELECT location_region.name, 
SUM(balance.value)*COUNT(DISTINCT id_user)/COUNT(id_user) AS money
FROM balance
LEFT JOIN user ON user.id_user = balance.id_user
LEFT JOIN pos ON pos.id_pos = user.id_pos
LEFT JOIN location_region ON location_region.id_region = pos.id_region
WHERE balance.date BETWEEN '2014-02-01' AND DATE_ADD('2014-02-01', INTERVAL 1 MONTH)
GROUP BY location_region.id_region
ORDER BY money DESC

在我的评论中,我想知道为什么你没有以user.id\u user=balance.id\u user的形式加入带有ON子句的user表。然而,我在我的询问中补充了这一点。希望这有帮助。

您当前的查询存在逻辑错误,余额表和用户表之间的联接条件不完整缺少balance.id\u user。因此,您应该在user.id\u user上设置balance LEFT JOIN user,而不是在user.id\u user=balance.id\u user上设置balance LEFT JOIN user。这会导致联接表的行数大于平衡表中的行数乘以用户表中的行数。因此,最终的总和带来了太高的价值

我在您的示例数据上尝试了以下查询我更改了一些值,它似乎工作正常:

SELECT location_region.name, SUM(balance.value) AS money
FROM balance
LEFT JOIN user USING(id_user)
LEFT JOIN pos USING(id_pos)
LEFT JOIN location_region USING(id_region)
WHERE balance.date BETWEEN '2014-02-01' AND DATE_ADD('2014-02-01', INTERVAL 1 MONTH)
GROUP BY location_region.id_region
ORDER BY money DESC

工作演示:

查询是否有错误?什么对您的查询不起作用?要得到比预期更多的结果?大约需要5秒的时间才能符合要求,而且每行的总和都带来了一个过高的值。在所有余额中,总和约为60k从余额中选择SUMvalue。。。但在执行上述查询时,最大值为716k。您在余额表的哪个字段上加入其余的表?@Neels不太明白您的问题。balance和location\u region之间的唯一链接是:balance->user->pos->location\u region它为所有记录返回相同的值:4564.314836您可以创建一个包含一些示例数据的小提琴吗?天哪!谢谢你。我真的看不见了。工作了几个小时后,一个人的大脑就不能正常工作了。我现在要去工作了,希望没有虫子,呵呵。再次感谢阿齐兹!