Как заменить одно значение, рассчитанное COUNT, другим значением в результате SELECT?

Предположим, есть две таблицы

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

Но вместо ожидаемых чисел и ни одного я получаю случайный набор цифр и букв. Как это сделать?

Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Проблема в том, что '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() для преобразования типов кажется мне вводящим в заблуждение.

есть ошибка в ELSE CAST(COUNT(s.seller_id) AS VARCHAR(255)).

Kaama 30.05.2019 15:11

@Каама. . . Это допустимый синтаксис SQL, хотя в некоторых базах данных он может иметь некоторые вариации. Вы все еще не добавили тег к вопросу для используемой вами базы данных.

Gordon Linoff 30.05.2019 15:13

моя вина. я использую SQL Fiddle для тестирования этого кода, который, в свою очередь, использует MySQL и SQLite, если я не ошибаюсь.

Kaama 30.05.2019 15:24
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

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

Должен ли я использовать Inner Join в этом случае?
Обновление первых 7 символов строки другими 3 символами с использованием SQL выдает «Ошибка 19 — ограничение UNIQUE не удалось: MGOFile.File»
Обновить таблицу столбцов со значением столбца из таблицы b, если она содержит подстроку из другого столбца из таблицы b
У меня есть хранимая процедура, и я сделал ее с помощью UNION; как я могу подсчитать общее количество строк?
Android - Комната, как добавить ссылку на внешний ключ для переноса данных
Как создать текущую последовательность в Oracle на основе значений столбца отчета
Обновление значений для всех строк на основе уникального идентификатора — Oracle
Таблица событий запросов BigQuery
Как вставить массив объектов JSON в PostgreSQL как отдельные элементы
Проверьте, имеет ли строка определенное окончание, сотрите это окончание, затем запишите эти строки в соответствии с двумя другими условиями