Ошибка SQL Неизвестный столбец в списке полей с использованием нескольких подзапросов

#mysql #sql #subquery

Вопрос:

Я пытаюсь напечатать текст на основе столбца. Моя идея заключалась в том, чтобы объединить все подсчеты для каждого занятия и использовать регистр для его отображения. Но я не уверен, что не так с этим кодом. Получение ошибки, поскольку sCount отсутствует в списке полей. Любая помощь приветствуется.

 SELECT  CASE

        WHEN Occupation = "doctor" THEN
        CONCAT("There are a total of ", dCount, " " , Occupation, "s.")
        
        WHEN Occupation = "singer" THEN
        CONCAT("There are a total of ", sCount, " " , Occupation, "s.")
        
        END
FROM (
    SELECT * FROM (
        SELECT COUNT(Occupation) AS dCount, Lower(Occupation) AS Occupation FROM OCCUPATIONS WHERE Occupation = 'Doctor'
    UNION
        SELECT COUNT(Occupation) AS sCount, Lower(Occupation) AS Occupation FROM OCCUPATIONS WHERE Occupation = 'Singer'
    ) AS s
) AS m;

// this didnt work either
SELECT  CASE

        WHEN Occupation = "doctor" THEN
        CONCAT("There are a total of ", dCount, " " , Occupation, "s.")
        
        WHEN Occupation = "singer" THEN
        CONCAT("There are a total of ", sCount, " " , Occupation, "s.")
        
        END
FROM (
    SELECT COUNT(Occupation) AS dCount, Lower(Occupation) AS Occupation FROM OCCUPATIONS WHERE Occupation = 'Doctor'
    UNION
    SELECT COUNT(Occupation) AS sCount, Lower(Occupation) AS Occupation FROM OCCUPATIONS WHERE Occupation = 'Singer'
) AS m;
 

Комментарии:

1. Имена столбцов для результирующего набора UNION берутся из имен столбцов первого оператора SELECT. — dev.mysql.com/doc/refman/8.0/en/union.html

2. Имя первого столбца вашего m подзапроса dCount . Псевдонимы столбцов второго запроса в UNION игнорируются.

3. Спасибо, какое самое простое решение для этого?

Ответ №1:

Вы пытаетесь сделать что-то подобное :

 CREATE TABLE OCCUPATIONS  (
  Occupation varchar(100) );

INSERT INTO OCCUPATIONS  VALUES ('doctor'),('doctor'),
                                ('singer'),('singer'),
                                ('doctor'),('doctor'),
                                ('singer'),('singer'),
                                ('doctor'),('singer'),
                                ('singer'),('singer');




SELECT  CASE
        WHEN Occupation = "doctor" THEN
        CONCAT("There are a total of ", tbl.dCount, " " , Occupation, "s.") 
        WHEN Occupation = "singer" THEN
        CONCAT("There are a total of ", tbl.sCount, " " , Occupation, "s.")        
        END as total_count
FROM (          
SELECT COUNT(Occupation) AS dCount,null as sCount, Lower(Occupation) AS Occupation 
FROM OCCUPATIONS 
WHERE Occupation = 'doctor'
group by Occupation 
union 
SELECT null as tst, COUNT(Occupation) AS sCount, Lower(Occupation) AS Occupation 
FROM OCCUPATIONS 
WHERE Occupation = 'singer'
group by Occupation 
      )
as tbl ;
 

Результат, основанный на моей демонстрации, будет:

total_count

Всего 5 врачей.

Всего 7 исполнителей.

Демонстрация: https://www.db-fiddle.com/f/pB6b5xrgPKCivFWcpQHsyE/28