Привет всем, я новичок в сервере MySQL и пытаюсь выполнить задание для класса. Кажется, я не могу найти решение. Буду признателен за любую оказанную помощь. Вот мой код, а вот сообщение об ошибке. Заранее спасибо.
Заявление об ошибке:
ОШИБКА 1054 (42S22) в строке 1: Неизвестный столбец «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
.
Аааа как же я это пропустил! ... Спасибо, Андреас!
Как прокомментировал @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 BY
, HAVING
и ORDER BY
.
Также читайте документацию об псевдонимах столбцов в https://dev.mysql.com/doc/refman/8.0/en/select.html и https://dev.mysql.com/doc/refman/8.0/ en/problems-with-alias.html
Спасибо Билл. Очень признателен . и сделает!
CASE WHEN Reason = 'Forced' THEN 1 ELSE 0 END
точно такой же, как Reason = 'Forced'
, поскольку MySQL (и MariaDB) используют 1 и 0 в качестве логических значений.
Таким образом, вы можете просто использовать SUM(Reason = 'Forced')
, чтобы получить Total_Number_Forced_Outage_Events.
Кроме того, COUNT(Reason = 'Forced')
даст вам Total_Number_Outage_Events, поскольку будут учитываться как единицы, так и нули (это не особенно полезно в вашем случае, но объясняет, почему следующее предложение верно).
Наконец, 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)
используются в одной и той же области видимости, и выполнит три вычисления одновременно.
Псевдоним столбца нельзя использовать в выражении другого столбца. Либо используйте само выражение, либо используйте подзапрос.