#mysql #subquery
#mysql #подзапрос
Вопрос:
Я работаю над запросом, который получит количество элементов с помощью подзапроса, где результат обоих подзапросов не равен нулю.
У меня есть этот запрос
SELECT s.id, (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND status = 'S') AS shipped, (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND (status = 'A' OR status = 'B')) AS unshipped FROM `sales` s WHERE s.status = 'A' OR s.status = 'B'
Что приводит к этому:
id | shipped | unshipped
1500 | NULL | 2
1501 | NULL | 1
1502 | NULL | 1
1503 | 1 | 2
1504 | 2 | NULL
1505 | 2 | 5
Мне нужны только результаты, в которых отправленные и неотправленные имеют положительное значение. Я попробовал несколько вещей, таких как
SELECT s.id, (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND status = 'S' HAVING SUM(qty) > 0) AS shipped, (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND (status = 'A' OR status = 'B') HAVING SUM(qty) > 0) AS unshipped FROM `sales` s WHERE s.status = 'A' OR s.status = 'B'
И
SELECT s.id, (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND status = 'S') AS shipped, (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND (status = 'A' OR status = 'B')) AS unshipped FROM `sales` s WHERE s.status = 'A' OR s.status = 'B' AND (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND status = 'S') IS NOT NULL AND (SELECT SUM(qty) FROM salesItems WHERE sale_id = s.id AND (status = 'A' OR status = 'B')) IS NOT NULL
Оба по-прежнему возвращают одни и те же результаты.
Я создал скрипку DB, но она не показывает найденных результатов, для чего я запустил тот же код через MySQL, и он возвращает все элементы
Ответ №1:
Основываясь на ответе @Arganas, вы можете использовать HAVING
SELECT s.id,
(
SELECT SUM(qty)
FROM salesItems
WHERE sale_id = s.id AND status = 'S'
) AS shipped,
(
SELECT SUM(qty)
FROM salesItems
WHERE sale_id = s.id AND (status = 'A' OR status = 'B')
) AS unshipped
FROM `sales` s
WHERE (s.status = 'A' OR s.status = 'B')
HAVING shipped is not Null and unshipped is not null
это скрипка https://www.db-fiddle.com/f/mHuQ4nCHZVPmEacog1iQvq/1
Ответ №2:
SELECT IFNULL(SUM(qty),0) ....
Ответ №3:
Я ни в коем случае не эксперт по SQL, но кажется, что это должно сработать.
SELECT s.id,
(
SELECT SUM(qty)
FROM salesItems
WHERE sale_id = s.id AND status = 'S'
) AS shipped,
(
SELECT SUM(qty)
FROM salesItems
WHERE sale_id = s.id AND (status = 'A' OR status = 'B')
) AS unshipped
FROM `sales` s
WHERE (s.status = 'A' OR s.status = 'B') and
shipped is not Null and
unshipped is not null
Комментарии:
1. Я попробовал это, он возвращает «#1054 — Неизвестный столбец «отправлено» в предложении where»»