2017-10-13 9 views
1

ont un syndicat comme celui-ci:SQL - filtrer les résultats d'une union

(SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price > 0 
GROUP BY prod.id, DATE(timestamp)) 
UNION 
(SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price = 0 
GROUP BY prod.id, DATE(timestamp)) 

Le problème:

S'il y a des dates où un produit est disponible avec le prix = 0 et prix> 0, nous obtenir deux lignes dans le résultat de l'union.

Ce que nous voulons est pour le prix = 0 résultat à ignorer s'il y a un prix> 0 résultat pour le même produit à la même date.

Quelqu'un qui peut partager un truc pour résoudre ce problème?

Répondre

1

Je ne l'appellerais pas un "truc". Il suffit d'ajouter une condition à la clause WHERE du côté price = 0 de l'UNION qui filtre les produits qui ont également un prix> 0.

Je le ferais avec une fonction NOT EXISTS() moi-même, mais il y en a plusieurs autres façons de le faire.

0

est-ce que vous essayez d'obtenir le "avoir un prix" à grouper séparément du "seulement avoir un 0 prix"? si c'est le cas, placez le premier groupe dans une table temporaire. Sélectionnez le second groupe dans lequel l'ID du produit ne figure pas dans la table temporaire.

CREATE TABLE #HASPRICE (prod.id INT, price Decimal, timestamp DATE) 

INSERT INTO #HASPRICE 
SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price > 0 
GROUP BY prod.id, DATE(timestamp) 

INSERT INTO #HASPRICE 
SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price = 0 AND prod.id not in (select prod.id from #HASPRICE) 
GROUP BY prod.id, DATE(timestamp)) 

sinon, cela fonctionnera

(SELECT prod.id, price, timestamp 
FROM products prod JOIN prices price ON prod.id = price.productid 
WHERE price >= 0 
GROUP BY prod.id, DATE(timestamp))