Mysql Выберите счетчик с помощью условного оператора

#mysql #database #mariadb

Вопрос:

Мне было поручено выполнить запрос, который подсчитывает столбец, если значение больше нуля, а другое равно нулю и больше нуля. Я пытался использовать CASE для mysql, но это не работает. Кто-нибудь может сказать мне, что я пропустил? Вот что я попробовал

 SELECT 
COUNT(CASE WHEN aci.approved > 0) as approved, 
COUNT(CASE WHEN aci.approved == 0 AND aci.pending > 0) as pending 
from `admin_case_info` as `aci` 
inner join `users_mws` on `users_mws`.`id` = `aci`.`users_mws_id` 
inner join `users` on `users`.`id` = `users_mws`.`user_id` 
where `users`.`status` not in ('Dumped','Dumped2') 
and `aci`.`case_type` = 'INBOUND_SHIPMENT'
 

Исключение, которое я получил, это

 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') as approved,
COUNT(CASE WHEN aci.approved == 0 AND aci.pending > 0) as pendi' at line 2
 

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

1. Без этого нет смысла пользоваться LIMIT ORDER BY . Также нет смысла выбирать COUNT по всей таблице, а также использовать LIMIT 10 . Пожалуйста, добавьте примеры данных к вашему вопросу.

2. Ох, прости. Я добавляю лимит для тестирования. Извините, пожалуйста, не обращайте внимания на ограничение, сэр @TimBiegeleisen

Ответ №1:

Вы можете суммировать логические выражения, что близко к синтаксису, который вы пытались использовать:

 SELECT
    SUM(aci.approved > 0) AS approved,
    SUM(aci.approved = 0 AND aci.pending > 0) AS pending
FROM admin_case_info AS aci
INNER JOIN users_mws ON users_mws.id = aci.users_mws_id
INNER JOIN users ON users.id = users_mws.user_id
WHERE users.status NOT IN ('Dumped', 'Dumped2') AND aci.case_type = 'INBOUND_SHIPMENT';
 

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

1. Это то же самое, что и граф, сэр? Так как я пытался подсчитать столбцы в зависимости от состояния

2. Ответ: Да, приведенная выше логика подсчитает, сколько раз логическое выражение будет истинным (значение true равно 1, а значение false равно 0). Попробуйте код самостоятельно.

3. Пытался использовать его, но это вызывает у меня You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '= 0 AND aci.pending > 0) AS pending FROM admin_case_info AS aci INNER JOIN use' at line 3

4. SUM(aci.approved = 0 ...) <— не используйте == для равенства, просто используйте =

Ответ №2:

ваша функция забыла завершить дело

(СЛУЧАЙ, КОГДА ваше условие ЗАТЕМ приводит к1, КОГДА ваше условие ЗАТЕМ приводит к2, ИНАЧЕ результат ЗАКАНЧИВАЕТСЯ);

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

1. можете ли вы подать пример?

Ответ №3:

 SELECT 
customerName, 
orderCount,
CASE orderCount
    WHEN 1 THEN 'One-time Customer'
    WHEN 2 THEN 'Repeated Customer'
    WHEN 3 THEN 'Frequent Customer'
    ELSE 'Loyal Customer'
end customerType
 

ОТ
cte
ЗАКАЗ ПО ИМЕНИ ПОЛЬЗОВАТЕЛЯ;