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 :

Cette requête est-elle possible ?


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Cette requête est-elle possible ?
    Bonjour,

    je me présente, je suis développeur asp.net avec une petite expérience en SQL avec Oracle et SqlServer.
    Cela fait des années que je me débrouille en consultant les forums et blogs, mais là je peine vraiment.

    Je viens donc vous demander votre aide.

    J'ai une table stock :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create table stock (
    produit nvarchar(30),
    quantite int)
     
    insert into stock values ('produit_a', 20)
    insert into stock values ('produit_b', 30)
    insert into stock values ('produit_c', 40)
    et une table commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create table commande (
    id_commande int,
    produit nvarchar(30),
    quantite int)
     
    insert into commande (1, 'produit_a', 10)
    insert into commande (1, 'produit_b', 10)
    insert into commande (1, 'produit_c', 10)
    insert into commande (2, 'produit_a', 10)
    insert into commande (2, 'produit_b', 30)
    insert into commande (3, 'produit_a', 10)
    je dois afficher un état de ces commandes, avec un indicateur permettant de savoir si pour chaque commande, il y a suffisamment de stock.

    MAIS je dois tenir compte de l'ordre des commandes !

    Ainsi ici ma commande 1 sera OK, il y a suffisamment de stock.
    Par contre pour ma commande 2, le produit B sera en rupture, car aux 30 en stock, il faut soustraire les 10 dans la commande 1.

    Je cherche à savoir si il est possible d'établir une requête me permettant d'obtenir ce résultat :

    commande / produit / valide
    1 / produit_a / ok
    1 / produit_b / ok
    1 / produit_c / ok
    2 / produit_a / ok
    2 / produit_b / nok
    3 / produit_a / nok

    le but étant d'avoir comme résultat final (mais cela je saurait l'obtenir si j'ai le résultat au dessus) :
    commande / valide
    1 / ok
    2 / nok
    3 / nok

    Avez-vous une idée ? Quelque chose à base de 2 CTE dont l'une se réfère à l'autre peut-être ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    La réponse va dépendre du SGBD concerné.
    Ce sera plus simple chez Oracle et SQL-Server 2012 que SQL-Server 2005/2008.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Ha oui pardon je n'ai pas précisé mon SGBDR.

    Pour l'instant je teste avec mon exemple ci-dessous sur un SQL serveur 2008, mais à terme je dois utiliser une base DB2 sous AS400, en version v5r quelque chose. Donc relativement ancienne je crois.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    L'idée c'est de faire une autojointure pour réaliser le cumul des commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
      select cm1.id_commande
           , cm1.produit
           , cm1.quantite
           , SUM(cm2.quantite) as quantite_cumul
        from commande as cm1
        join commande as cm2
          on cm1.produit      = cm2.produit
         and cm1.id_commande >= cm2.id_commande
    group by cm1.id_commande
           , cm1.produit
           , cm1.quantite;
     
    id_commande produit                        quantite    quantite_cumul
    ----------- ------------------------------ ----------- --------------
    1           produit_a                      10          10
    1           produit_b                      10          10
    1           produit_c                      10          10
    2           produit_a                      10          20
    2           produit_b                      30          40
    3           produit_a                      10          30
    À partir de là il suffit de comparer avec les stocks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    with commande_cumul as
    (
      select cm1.id_commande
           , cm1.produit
           , cm1.quantite
           , SUM(cm2.quantite) as quantite_cumul
        from commande as cm1
        join commande as cm2
          on cm1.produit      = cm2.produit
         and cm1.id_commande >= cm2.id_commande
    group by cm1.id_commande
           , cm1.produit
           , cm1.quantite
    )
    select cmd.id_commande
         , cmd.produit
         , cmd.quantite
         , cmd.quantite_cumul
         , case when cmd.quantite_cumul > stk.quantite then 'nok' else 'ok' end as valide
      from commande_cumul as cmd
      join stock          as stk
        on stk.produit = cmd.produit;
     
    id_commande produit                        quantite    quantite_cumul valide
    ----------- ------------------------------ ----------- -------------- ------
    1           produit_a                      10          10             ok
    1           produit_b                      10          10             ok
    1           produit_c                      10          10             ok
    2           produit_a                      10          20             ok
    2           produit_b                      30          40             nok
    3           produit_a                      10          30             nok
    Et pour remonter au niveau de la commande, une petite astuce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    with commande_cumul as
    (
      select cm1.id_commande
           , cm1.produit
           , cm1.quantite
           , SUM(cm2.quantite) as quantite_cumul
        from commande as cm1
        join commande as cm2
          on cm1.produit      = cm2.produit
         and cm1.id_commande >= cm2.id_commande
    group by cm1.id_commande
           , cm1.produit
           , cm1.quantite
    )
      select cmd.id_commande
           , min(case when cmd.quantite_cumul > stk.quantite then 'nok' else 'ok' end) as valide
        from commande_cumul as cmd
        join stock          as stk
          on stk.produit = cmd.produit
    group by cmd.id_commande;
     
    id_commande valide
    ----------- ------
    1           ok
    2           nok
    3           nok

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Bravo
    Alors là j'ai qu'un mot à dire : balèze !

    Je tâtonnais dans ce sens mais je n'arrivais pas à formaliser, il me manquait la notion du cumul des commandes.

    Vraiment merci beaucoup Waldar

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

Discussions similaires

  1. cette requête est-elle possible ?
    Par night_flyers dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/07/2009, 13h12
  2. cette instruction est elle possible ?
    Par poulette3000 dans le forum Débuter
    Réponses: 4
    Dernier message: 06/10/2007, 23h48
  3. cette requette est elle possible?
    Par domino_dj dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/03/2007, 11h08
  4. cette requête est-elle correcte?
    Par spilliaert dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/02/2006, 22h33
  5. Cette requête est-elle valide?
    Par FrankOVD dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/01/2006, 19h21

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