Определение, содержит ли образец 0 строк для нескольких идентификаторов - PullRequest
0 голосов
/ 27 декабря 2018

Итак, я создал простой запрос, который передаст все OrdID, которые имеют заказы 2 или более яблок:

SELECT ordid 
FROM results 
WHERE ordid IN (12,24,53,21,41,51) 
AND product = 'apples' 
GROUP BY ordid 
HAVING COUNT(ordid) > 1

Как я могу сделать это для OrdID, которыесодержать 0 яблок? (Это не работает, так как на OrdID яблок нет продукта, поэтому он пропускает 0 строк.) Я бы хотел перечислить все OrdID, которые имеют <1 продуктов для яблок. </p>

SELECT ordid 
FROM results 
WHERE ordid IN (12,24,53,21,41,51)
AND product = 'apples' 
GROUP BY ordid 
HAVING COUNT(ordid) < 1

Ответы [ 4 ]

0 голосов
/ 27 декабря 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что вы выбираете из таблицы (т. Е. Ограничиваете эти строки), где вы хотите сопоставить то, чего нет в таблице (т. Е. Исключаете эти строки).Это противоположности.

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

SELECT ordid FROM (VALUES (12),(24),(53),(21),(41),(51)) AS ordids(ordid)
WHERE NOT EXISTS (
    SELECT * FROM results
    WHERE results.ordid = ordids.ordid
    AND results.product = 'apples'
)

Это вернет результат для ordid даже если это значение никогда не появляется в таблице results.

0 голосов
/ 27 декабря 2018

Я переключил HAVING с COUNT () продуктов вместо orderid, так как вы пытаетесь подсчитать количество продуктов.

SELECT ordid
FROM results 
WHERE ordid in (12,24,53,21,41,51) and product = 'apples'
GROUP BY ordid 
HAVING COUNT(product) = 0
0 голосов
/ 27 декабря 2018

Используйте функцию EXISTS (), чтобы получить все OrdID, ГДЕ НЕ СУЩЕСТВУЕТ коррелированная строка с product = 'apples'

0 голосов
/ 27 декабря 2018

Я не могу воспроизвести на моей машине, но я надеюсь, что этот запрос должен работать:

SELECT ordid 
FROM results 
WHERE ordid in (12,24,53,21,41,51) 
GROUP BY ordid 
HAVING SUM(CASE WHEN product = 'apples' THEN 1 ELSE 0 END) < 1
...