2014-10-20 4 views
0

Я хочу выбрать SKU, который не находится ('DC01', '5000'), но находится в ('1003', '1039', '1012'), где СУММ больше 3. Я намерен вернуть нулевые записи, так как SKU '000000001041106003' находится в '1003' с StockOnH и больше 3, но имеет значение StoreID 'DC01', однако значение SKU '000000001041106003 'возвращается. Этот SKU имеет StoreID от «DC01» и «1003».SQL SELECT * WHERE значение NOT IN list и IN другой список

Что мне нужно сделать, чтобы получить желаемый результат?

productName     SKU StoreId StockOnHand webenabled 

.Speedo Yarn 000000001041106001 1003  1   1 
.Speedo Yarn 000000001041106002 1003  3   1 
.Speedo Yarn 000000001041106003 1003  4   1 
.Speedo Yarn 000000001041106003 DC01  0   1 


SELECT DISTINCT(SKU) 
FROM etlStoreAssortment 
WHERE StoreId NOT IN ('DC01','5000') 
AND StoreId IN ('1003','1039','1012') GROUP BY SKU HAVING SUM(StockOnHand) > 3 
+0

им не уверены, какой диалекте вы используете, но в любом случае я бы писать «... НЕ В ...» так «... НЕ StoreID IN (....» – user2504380

+1

В соответствии с данными и вашим запросом вывод правильный. Каждая запись проверяется отдельно от условий. –

ответ

1

ГДЕ смотрит на одну запись. Там - одна запись для '000000001041106003', где StoreId NOT IN ('DC01', '5000') и StoreId IN ('1003', '1039', '1012'). То, что вы ищете, это то, где хотя бы одна запись на группу имеет или не имеет определенного значения. Используйте HAVING для этого:

SELECT DISTINCT(SKU) 
FROM etlStoreAssortment 
GROUP BY SKU 
HAVING SUM(StockOnHand) > 3 
AND MAX(CASE WHEN StoreId IN ('DC01','5000') THEN 1 ELSE 0 END) = 0 
AND MAX(CASE WHEN StoreId IN ('1003','1039','1012') THEN 1 ELSE 0 END) = 1; 
+0

Благодарим за помощь. –