J'ai une table avec 4 colonnes.
et j'ai besoin de trouver tous les store_ids qui ont tous les products_id avec le même label_id (par exemple 4) en une journée.
par exemple:
select * from table where product_id = all(Inner query)
3 Réponses :
Voici une façon:
SELECT date, store_id FROM yourTable GROUP BY date, store_id HAVING COUNT(DISTINCT product_id) = (SELECT COUNT(DISTINCT product_id) FROM yourTable t2 WHERE t2.date = t1.date) ORDER BY date, product_id;
Cette requête se lit d'une manière assez simple, et elle dit de trouver chaque produit, à une certaine date, dont le nombre de produits distinct est le même que le produit distinct compte de produits le même jour, dans tous les magasins.
Je serais probablement agrégé à des listes de produits dans une chaîne ou un tableau:
with products_per_day_and_store as ( select store_id, date, string_agg(distinct product_id order by product_id) as products from mytable where label_id = 4 group by store_id, date ) , products_per_day ( select date, string_agg(distinct product_id order by product_id) as products from mytable where label_id = 4 group by date ) select distinct ppdas.store_id from products_per_day_and_store ppdas join products_per_day ppd using (date, products);
D'après votre question, il n'est pas clair si les libellés sont spécifiques à un jour donné ou à l'ensemble de la période. Mais une variante de la réponse de Tim semble appropriée. Pour tout libellé:
SELECT t.date, t.store_id FROM t WHERE t.label = 4 GROUP BY t.date,t.store_id HAVING COUNT(DISTINCT t.product_id) = (SELECT COUNT(DISTINCT t2product_id) FROM t t2 WHERE t2.label = t.label );
Pour un libellé particulier:
SELECT t.date, t.label, t.store_id FROM t GROUP BY t.date, t.label, t.store_id HAVING COUNT(DISTINCT t.product_id) = (SELECT COUNT(DISTINCT t2product_id) FROM t t2 WHERE t2.label = t.label );
Si les libellés sont spécifiques à la date , alors vous avez également besoin de cette comparaison dans les requêtes externes.
Avez-vous essayé
where label_id = 4 and date = ...
?Le magasin 4 serait également affiché pour l'étiquette 3, car pour l'étiquette 3, il n'y avait qu'un seul produit vendu le 9/2 et le magasin 4 a vendu ce produit. Votre requête doit-elle porter sur une étiquette particulière ou sur toutes les étiquettes? Votre requête doit-elle rechercher un jour particulier ou tous les jours? Et pouvez-vous s'il vous plaît montrer le résultat attendu? Voulez-vous simplement afficher les numéros de magasin? Ou stocker et dater? Ou quoi d'autre?
@ThorstenKettner ma requête doit renvoyer tous les store_id qui contiennent tous les produits possibles pour label_id = 4 pour le jour, la sortie souhaitée doit être 4 car c'est le seul magasin qui contient tous les produits pour ce jour. dans le magasin 4 j'ai des identifiants de produits - 5,7 et dans store_id = 5 je n'ai que product_id = 7 ..
D'accord, vous souhaitez afficher tous les magasins qui correspondent à cette exigence, quel que soit le jour. Un résultat peut être 4 et vous sauriez que le magasin 4 a vendu tous les produits de l'étiquette 4 un jour qui ont été vendus à ce moment-là, mais vous ne savez pas quel jour. Quel est votre SGBD?
droite .. postgres 11
Le nombre de produits est-il statique?
all products_id
Comment connaissez-vous tous product_ids? Il existe peut-être un produit avec id = 13, qui n'est pas présent dans cette table.non, je voulais dire tous les product_ids pour un jour donné, dans l'exemple je recherche un magasin qui contient les produits 5 et 7 ..