MySQL GROUP BY未按预期工作

时间:2017-11-24 20:07:48

标签: mysql stored-procedures group-by

我编写了一系列嵌套程序,为员工执行一些薪酬计算。在整个这些过程中,数据存储在临时表中。

现在,当我在其中一个临时表上执行GROUP BY时,问题就出现了一些意想不到的行为。您可以在此处查看该步骤的示例: http://www.sqlfiddle.com/#!9/f4095/2

预期的行为是该GROUP BY输出employeeid列表和相应的聚合。 sqlfiddle按预期工作。但是,正在发生的事情是我在输出中获得一行空白employeeid和所有行的聚合值。但是,如果我在上一步中过滤数据以包含单个唯一employeeid,那么我在输出中获得单行(如预期的那样)并且employeeid列包含值而不是空白。

最初,我认为这可能是一个内存问题,因为我使用了很多临时表(我的理解是它们存储在内存中)并没有放弃它们。所以我修改了所有程序,以便在不再需要时立即删除任何临时表。我仍然面临同样的问题。我的表大约有2000行和大约100列,GROUP BY的输出应该只有大约300行和7列。

我将继续考虑不同的方法来测试这个,并且如果我找到任何东西会更新,但我的问题是:有没有人知道任何可能导致这种行为的事情?

编辑:我在上面的sqlfiddle中提供了一个简化版本,但是这里是导致问题的语句(正在GROUPED的表temp_rawpaycalc包含shift_idemployeeid,以及正在汇总的所有列。employeeid位于SELECTGROUP BYshift_id被排除在外。{/ p>

DROP TEMPORARY TABLE IF EXISTS temp_topupaggr; CREATE TEMPORARY TABLE temp_topupaggr SELECT employeeid, SUM(hoursworked) AS TotalHours, SUM(minguaranteepayamount) AS TotalMinGuarantee, ( SUM(baseWagePayAmount) + SUM(basicAppPayAmount) + ... SUM(suppPayAmount)) AS TotalEarnings, SUM(reported_hoursworked) AS reported_TotalHours, SUM(reported_minGuaranteePayAmount) AS reported_TotalMinGuarantee, ( SUM(reported_baseWagePayAmount) + SUM(reported_basicAppPayAmount) + ... SUM(reported_suppPayAmount)) AS reported_TotalEarnings FROM temp_rawpaycalc GROUP BY employeeid;

1 个答案:

答案 0 :(得分:0)

存储过程参数似乎比存储过程中的表的字段名称具有更高的优先级;如果存储过程中使用的查询中的字段名称和参数存在不明确的标识符,则很难识别问题。

解决方案:始终限定此类字段名称(无论如何都是良好实践)和/或不要对存储过程中的参数使用标识符,这些参数可能与过程引用的表中的字段名称冲突(即使字段名称也是一般可读性的良好实践)总是合格的。)