having 子句中的 Unknow 列 - mysql

Unknow column in having clause - mysql

提问人:JDubs 提问时间:9/16/2023 最后编辑:ShadowJDubs 更新时间:9/16/2023 访问量:39

问:

我知道这已经得到了回答,但由于我缺乏mysql的经验,我无法从回复中破译解决方案,所以请原谅我再次问同样的问题。我正在将 ms-access 查询转换为 mysql,这对我来说是一个伤害的世界......我遇到的问题是我得到了“未知列。在“having clause”中。Big DitchBegindate

我试过了这个:

SELECT Sum(datediff(`Big Ditch`.`EndDate`,`Big Ditch`.`BeginDate`)*`Big Ditch`.`Amount`) AS `BigDitchTotal`, extract(year from `Big Ditch`.`BeginDate`) AS Expr1
FROM `Big Ditch`
GROUP BY (extract(year from `Big Ditch`.`BeginDate`))
HAVING (extract(year from `Big Ditch`.`BeginDate`) = current_date());
sql MySQL的 拥有

评论

1赞 Barmar 9/16/2023
HAVING聚合后会检查条件,因此测试原始表中的列没有意义。你应该为此使用。WHERE
0赞 JDubs 9/16/2023
感谢您的快速依赖。当我用 WHERE 替换 HAVING 时,我在 WHERE 下得到红色波浪线下划线,说它在这个位置无效......
0赞 Barmar 9/16/2023
答案是肯定的。 在.这是基本的 SQL。WHEREGROUP BY
0赞 JDubs 9/16/2023
谢谢。是的,我肯定可以使用一些 sql 训练。正如我所说,我正在尝试在没有 sql 经验的情况下将访问数据库转换为 mysql。祝我好运。
0赞 Barmar 9/16/2023
如何将一年与特定日期进行比较?

答:

0赞 Barmar 9/16/2023 #1

在执行聚合之前按年份筛选行,以减少必须处理的数据量。

MySQL 有一个内置函数,您可以使用它来代替 .YEAR()EXTRACT()

您不需要,因为您只显示一年的结果,这是您在条件中选择的结果。GROUP BYWHERE

SELECT Sum(datediff(`Big Ditch`.`EndDate`,`Big Ditch`.`BeginDate`)*`Big Ditch`.`Amount`) AS `BigDitchTotal`, MAX(YEAR(`Big Ditch`.`BeginDate`)) AS Expr1
FROM `Big Ditch`
WHERE YEAR(`Big Ditch`.`BeginDate`) = YEAR(current_date())

评论

0赞 JDubs 9/16/2023
我会竖起你的回答,但我得到一个错误:错误代码:1140。在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #2 包含非聚合列 'gmwua_alpha。大沟.BeginDate';这与 sql_mode=only_full_group_by 不兼容
0赞 JDubs 9/16/2023
您之前的回复已成功。
0赞 Barmar 9/16/2023
在它周围添加一个聚合函数可以修复它,我已经更新了答案。
0赞 JDubs 9/16/2023
好!再次感谢Barmar!
0赞 Jonas Metzler 9/16/2023
这种情况可能会使此查询变得非常慢。把它写成可能更快YEAR(BeginDate) = YEAR(current_date())BeginDate >= '2023-01-01' AND BeginDate <= '2023-12-31'