Haven子句不过滤mysql记录

时间:2018-10-10 11:10:43

标签: mysql sql group-by aggregate-functions

我正在尝试为特定total sum of hours的每个project_type获取year,因此结果是一行。

这是我的SQL查询:

select SUM(total_hours) as hours, year(task_completion) as year
from task_details
group by project_type_id
having year = '2018' AND project_type_id = 10

此外,这是我的数据集的样子:

project_type_id  |   total_hours   |  task_completion
-------------------------------------------------------
10               |   5             |  2018-9-10
10               |   4             |  2018-9-11
10               |   10            |  2017-9-10
10               |   2             |  2016-9-10
11               |   9             |  2017-9-10
14               |   8             |  2017-9-11

查询给出的输出为:

hours  |  year
---------------
21     |  2018

但是我希望它是9

查询出了什么问题?

2 个答案:

答案 0 :(得分:1)

您需要在 int foundIndex; if ((foundIndex = lstName.Items.IndexOf(txtName.Text)) != -1) { MessageBox.Show(lstName.Items[foundIndex].ToString()); } 中使用年份和project_type_id而不是where的条件,否则它是对所有年份的值求和:

having

答案 1 :(得分:1)

您的查询逻辑已关闭。您有GROUP BY中的SELECT使用不同的未聚合列。 HAVING中有既不聚合也不在GROUP BY中的列。 MySQL扩展了其语法以允许这样做。但是,查询(和结果)没有意义。

您的查询应如下所示:

select sum(total_hours) as hours, year(task_completion) as year
from task_details
where project_type_id = 10
group by year
having year = 2018;

有什么区别?注意:

  • project_type_id的比较位于聚合之前(而不是聚合之后)的WHERE子句中。
  • GROUP BY子句包含SELECT中未聚合的列。
  • year是一个数字,因此比较是一个数字,而不是字符串。

我建议您在聚合之前进行所有比较-因此不需要having子句:

select sum(total_hours) as hours,
       year(task_completion) as year
from task_details
where project_type_id = 10 and
      task_completion >= '2018-01-01' and
      task_completion < '2019-01-01'
group by year;

请注意,此版本不使用year()。列上的函数可能会妨碍索引的使用。此版本可以在(project_type_id, task_completion)上使用索引。