Предположим, есть две таблицы
shop seller
------ -------
id id
seller_id seller_name
goods sallary
продавец_ид может повторяться, частей из продавца.ид может вообще не быть. Итак, мне нужно получить результат запроса, состоящий из имени продавца и подсчета количества магазинов у каждого продавца. я сделал вот так
SELECT seller_name, COUNT(seller_id) AS shops FROM seller
LEFT JOIN shop ON seller.id = shop.seller_id GROUP BY seller_name.
И это работает. Но проблема в том, что мне нужно заменить все 0 в магазинах текстом «нет». Я пытался сделать это через
REPLACE(COUNT(seller_id),0,"none")
и с
CASE
WHEN COUNT(seller_id)=0 THEN "none"
ELSE COUNT(seller_id)
END
Но вместо ожидаемых чисел и ни одного я получаю случайный набор цифр и букв. Как это сделать?
Проблема в том, что 'none'
— это строка, а значение — это число. Я бы настоятельно рекомендовал вам придерживаться цифр, но это не ваш вопрос.
Вам нужно сделать преобразование типа:
SELECT se.seller_name,
(CASE WHEN COUNT(s.seller_id) = 0
THEN 'none'
ELSE CAST(COUNT(s.seller_id) AS VARCHAR(255))
END) AS shops
FROM seller se LEFT JOIN
shop s
ON se.id = sh.seller_id
GROUP BY se.seller_name;
В MySQL используйте CAST(COUNT(s.seller_id) AS CHAR)
. Или почти любая база данных поддерживает CONCAT(COUNT(s.seller_id), '')
, но использование CONCAT()
для преобразования типов кажется мне вводящим в заблуждение.
@Каама. . . Это допустимый синтаксис SQL, хотя в некоторых базах данных он может иметь некоторые вариации. Вы все еще не добавили тег к вопросу для используемой вами базы данных.
моя вина. я использую SQL Fiddle для тестирования этого кода, который, в свою очередь, использует MySQL и SQLite, если я не ошибаюсь.
Point 1: REPLACE(COUNT(seller_id),0,"none") --It will replace all zero's with 'none'.
Как будто ваш счет равен 10, он вернет 1нет на выходе.
Point 2: CASE WHEN COUNT(seller_id)=0 THEN "none" ELSE COUNT(seller_id) END--It will gives you conversion failed error.
Итак, вам нужно, чтобы вы привели счет в varchar, как указано ниже.
SELECT se.seller_name,
(CASE WHEN COUNT(s.seller_id) = 0
THEN 'none'
ELSE CAST(COUNT(s.seller_id) AS VARCHAR(10))
END) AS shops
FROM seller se LEFT JOIN
shop s
ON se.id = sh.seller_id
GROUP BY se.seller_name;
Вам нужно изменить запрос на что-то вроде этого:
SELECT seller_name,
CASE
WHEN COUNT(shop.Id)=0 THEN 'none'
ELSE CAST(COUNT(shop.Id) as NVARCHAR(10))
END AS shops FROM seller
LEFT JOIN shop ON seller.id = shop.seller_id GROUP BY seller_name
есть ошибка в ELSE CAST(COUNT(s.seller_id) AS VARCHAR(255)).