【问题标题】:Unable to ALIAS a simple CASE statement无法对简单的 CASE 语句进行 ALIAS
【发布时间】:2021-03-23 11:30:22
【问题描述】:

大家好,我是 MySQL 服务器的新手,正在努力完成课堂作业。我似乎找不到解决方案。任何帮助深表感谢。这是我的代码,这是错误声明。提前谢谢你。

错误声明:

第 1 行出现错误 1054 (42S22):“字段列表”中的未知列“Total_Number_Forced_Outage_Events”


SELECT 
 
SUM(CASE 

WHEN Reason = 'Forced' THEN 1 ELSE 0 END) AS Total_Number_Forced_Outage_Event,

Count(*)AS Total_Number_Outage_Events,

Total_Number_Forced_Outage_Events / Total_Number_Outage_Events AS Forced_Outage_Percentage,

YEAR(Start_Time) AS Year

FROM AEMR 

WHERE Status = 'Approved' 

GROUP BY Year 

ORDER BY Year 

;

【问题讨论】:

  • 列别名不能用于其他列的表达式。要么使用表达式本身,要么使用子查询。
  • Total_Number_Forced_Outage_Event != Total_Number_Forced_Outage_Events --- 最后有一个s
  • 啊,我怎么错过了! ...谢谢安德烈亚斯!

标签: mysql aliasing


【解决方案1】:

正如@Akina 上面评论的那样,您不能在定义别名的同一查询中引用别名。

但是,您可以在子查询中定义别名并在外部查询中使用它:

SELECT t.*,
  Total_Number_Forced_Outage_Events / Total_Number_Outage_Events
    AS Forced_Outage_Percentage
FROM (
    SELECT 
      SUM(CASE WHEN Reason = 'Forced' THEN 1 ELSE 0 END)
        AS Total_Number_Forced_Outage_Events,
      COUNT(*) AS Total_Number_Outage_Events,
      YEAR(Start_Time) AS Year
    FROM AEMR 
    WHERE Status = 'Approved' 
    GROUP BY Year 
) AS t
ORDER BY Year;

t 在本例中是子查询的表别名。

例外:MySQL 允许您在 GROUP BYHAVINGORDER BY 子句中使用在同一查询中定义的别名。

另请阅读https://dev.mysql.com/doc/refman/8.0/en/select.htmlhttps://dev.mysql.com/doc/refman/8.0/en/problems-with-alias.html 中有关列别名的文档

【讨论】:

  • 谢谢比尔。非常感激 。会做的!
【解决方案2】:

CASE WHEN Reason = 'Forced' THEN 1 ELSE 0 ENDReason = 'Forced' 完全相同,因为 MySQL(和 MariaDB)使用 1 和 0 作为布尔值。

所以您可以使用SUM(Reason = 'Forced') 来获取 Total_Number_Forced_Outage_Events。

另外,COUNT(Reason = 'Forced') 会为您提供 Total_Number_Outage_Events,因为将同时计算 1 和 0(这在您的情况下并不是特别有用,但它解释了为什么下一句为真)。

最后,AVG(Reason = 'Forced') 会给你 Forced_Outage_Percentage(因为AVG(x) 本质上是SUM(x) / COUNT(x))。

因此,编写查询的一种方法是:

SELECT 
  SUM(Reason = 'Forced') AS Total_Number_Forced_Outage_Event,
  COUNT(Reason = 'Forced') AS Total_Number_Outage_Events,
  AVG(Reason = 'Forced') AS Forced_Outage_Percentage,
  YEAR(Start_Time) AS Year
FROM AEMR 
WHERE Status = 'Approved' 
GROUP BY Year 
ORDER BY Year 
;

我认为已经足够简洁了。

请注意,写COUNT(Reason = 'Forced') 而不是COUNT(*) 可能更有效,因为优化器可能会看到SUM(x)COUNT(x)AVG(x) 在同一范围内使用,并且一次做三个计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多