IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Sélectionner l'état le plus récent d'un produit


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut Sélectionner l'état le plus récent d'un produit
    Bonjour,

    Qui pourrait m'aider pour concevoir une requête spécifique généralisée ?

    Dans mon schéma, je dispose de deux tables : PRODUITS et VENTES. Pour faire court, je les restreins aux colonnes concernées par mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PRODUITS.IDPROD, clé primaire
     
    VENTES.IDPROD, clé étrangère qui permet de faire la jointure
    VENTES.DTRECEP, date de réception produit
    VENTES.DTRAYON, date de mise en rayon
    VENTES.DTTRANS, date de vente officielle
    VENTES.DTINVALIDATION, date de retrait du produit
    Un produit quelconque est instancié de façon unique dans la table PRODUITS. Cependant, il peut avoir de multiples états, à chaque état correspond une instance de VENTES.

    Un fournisseur livre un produit, qui entre aussitôt dans le stock, ceci génère une instance de VENTES, avec DTRECEP remplie.

    Par exemple, un fournisseur livre 6 paquets de yaourts, cela crée 6 rows dans VENTES.

    Quand ce produit est mis en rayon/vente, la date DTRAYON est générée.

    Deux cas se présentent alors : soit le produit est vendu, auquel cas la DTTRANS est validée, soit il ne l'est jamais ou est périmé, auquel cas il est retiré et la DTINVALIDATION est remplie.

    Donc, tant que DTTRANS et DTINVALIDATION sont "null", le produit est en rayon.

    Si je cherche un produit précis pour demander son instance vendue la plus récente, la requête est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT IDPROD FROM VENTES
    WHERE 
    IDPROD = <clé> AND
    DTTRANS = (SELECT GREATEST(DTTRANS) FROM VENTES WHERE IDPROD = <clé>);
    Malheureusement, si je veux généraliser cette requête à la table toute entière, je n'y arrive pas, puisque je ne sais pas comment donner la clé dans la sous-requête. Ma seule solution pour le moment est de faire une procédure à laquelle je fournis la clé IDPROD...

    N'y aurait-il pas une requête SQL qui me permettrait de faire une passe générale ?

    Merci par avance de vos réponses.

  2. #2
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    voici le cas generale de ta requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT V.IDPROD FROM VENTES V
    WHERE  V.DTTRANS = (SELECT GREATEST(V_1.DTTRANS) 
                      FROM VENTES V_1 
                      WHERE V.IDPROD = V_1.IDPROD);
    Cette requete va afficher tous les produits qui verifient les conditions.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Es-tu sur que c'est bien GREATEST qu'il faut utiliser et pas MAX ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par boussafi Voir le message
    voici le cas generale de ta requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT V.IDPROD FROM VENTES V
    WHERE  V.DTTRANS = (SELECT GREATEST(V_1.DTTRANS) 
                      FROM VENTES V_1 
                      WHERE V.IDPROD = V_1.IDPROD);
    Cette requete va afficher tous les produits qui verifient les conditions.
    Effectivement, ça fonctionne. C'était vraiment simple...

    Merci !

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Es-tu sur que c'est bien GREATEST qu'il faut utiliser et pas MAX ?
    Euuuh... Je ne sais pas... Quelle est la différence entre MAX et GREATEST ?...

    Ça fonctionne bien en mettant GREATEST.

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut


    DomIII ,dis à al1_24 que suis
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    al1_24 a raison.
    GREATEST est une fonction qui compare les arguments qu'on lui passe :
    GREATEST(1, 2, 3) retourne 3.
    MAX est une fonction d'agrégation qui va retourner la valeur maximale de toute la colonne.
    Le code de boussafi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT V.IDPROD
      FROM VENTES V
     WHERE V.DTTRANS = (SELECT GREATEST(V_1.DTTRANS) 
                          FROM VENTES V_1 
                         WHERE V.IDPROD = V_1.IDPROD);
    Est le même que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT V.IDPROD
      FROM VENTES V
     WHERE V.DTTRANS = (SELECT V_1.DTTRANS
                          FROM VENTES V_1 
                         WHERE V.IDPROD = V_1.IDPROD);
    Qui est le même que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT V.IDPROD
      FROM VENTES V
     WHERE V.DTTRANS IS NOT NULL;
    La requête dont vous avez probablement besoin serait plutôt celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SELECT IDPROD, MAX(DTTRANS) as DTTRANS
        FROM VENTES
    GROUP BY IDPROD;

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 162
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par Waldar Voir le message

    La requête dont vous avez probablement besoin serait plutôt celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SELECT IDPROD, MAX(DTTRANS) as DTTRANS
        FROM VENTES
    GROUP BY IDPROD;
    Merci beaucoup ! Effectivement, cette dernière me rend bien service.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélectionner selon la date la plus récente
    Par majduuus dans le forum Linq
    Réponses: 19
    Dernier message: 31/07/2013, 18h45
  2. Réponses: 4
    Dernier message: 27/12/2012, 13h30
  3. Réponses: 4
    Dernier message: 05/05/2011, 13h46
  4. Réponses: 3
    Dernier message: 18/02/2009, 10h00
  5. routine DOS pour sélectionnée le fichier le plus récent
    Par sofiane1111 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 21/09/2007, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo