#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
ЗАКАЗ ПО ИМЕНИ ПОЛЬЗОВАТЕЛЯ;