#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