Получение результатов Mysql, где подзапрос не равен нулю

#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, и он возвращает все элементы

https://www.db-fiddle.com/f/mHuQ4nCHZVPmEacog1iQvq/0

Ответ №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»»