1
votes

sql - sélectionnez toutes les lignes qui ont toutes les mêmes cols multiples

J'ai une table avec 4 colonnes.

  • date
  • store_id
  • id_produit
  • label_id

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)


8 commentaires

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 ..


3 Réponses :


1
votes

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.


0 commentaires

0
votes

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);


0 commentaires

2
votes

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.


0 commentaires