我正在尝试为特定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
。
查询出了什么问题?
答案 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)
上使用索引。