Невозможно использовать ALIAS для простого оператора CASE

Привет всем, я новичок в сервере 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 

;

Псевдоним столбца нельзя использовать в выражении другого столбца. Либо используйте само выражение, либо используйте подзапрос.

Akina 12.12.2020 05:49
Total_Number_Forced_Outage_Event != Total_Number_Forced_Outage_Events --- В конце есть s.
Andreas 12.12.2020 05:49

Аааа как же я это пропустил! ... Спасибо, Андреас!

colin barclay 13.12.2020 01:33
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
3
374
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как прокомментировал @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

Спасибо Билл. Очень признателен . и сделает!

colin barclay 13.12.2020 01:37

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) используются в одной и той же области видимости, и выполнит три вычисления одновременно.

Другие вопросы по теме