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

Développement SQL Server Discussion :

Requête SQL Server


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut Requête SQL Server
    Bonjour tout le monde,
    Je bloque sur une requête, j’utilise SQL serveur 2014 et mon problème est le suivant :

    J’ai la Table : commande client
    ID_Commande ID_Client Code article Quantité
    9 X Ar1 1
    9 X Ar2 3
    9 X Ar3 4

    Et la Table livraison client qui contient en clé étranger la table commande client ci-dessus :
    Nous avons effectué en deux livraisons les articles commandés par le client X:

    1/ Première livraison :
    ID_Commande ID_Livraison Code article Qty
    9 23 Ar1 1
    9 23 Ar3 2

    2/ deuxième Livraison :
    ID_Commande ID_Livraison Code article Qty1
    9 24 Ar2 3
    9 24 Ar3 2

    Je voudrai créer avec une requête un état sur les deux livraisons et retourner le résultat suivant :

    ID_Commande ID_Livraison Code article Qty
    9 24 Ar2 3
    9 24 Ar3 2
    9 23 Ar1 1

    C’est-à-dire dans mon état j’aurai tous les articles de la commande, pour les articles livrés en deux fois comme l’article « Ar3 » je voudrais avoir la ligne quand il a été livré pour la dernière fois (pas de répétition, juste la dernière livraison).

    J’ai déjà utilisé ces requêtes et cela n’a rien donné :

    1* DISTINCT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT Commande.CodeArticle, Livraison. Qty, Livraison.ID_livraison, Commande.ID_Commande
    FROM Livraison 
    inner join Commande ON Commande.ID_Commande = Livraison.ID_Commande 
    where Commande.ID_Commande = '9'
    2* SUBQUERY

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from (Select Commande.CodeArticle, Livraison. Qty, from Livraison 
    inner join Commande ON Commande.ID_Commande = Livraison.ID_Commande
    where Commande.ID_Commande = '9') 
    group by a.CodeArticle, a.Qty
    Je vous remercie par avance !

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 633
    Billets dans le blog
    10
    Par défaut
    Bonsoir,

    Si la description de vos tables est exhaustive, et que les identifiants sont attribués par le SGBD, alors vous ne pouvez pas construire de requete fiable à 100% pour obtenir le résultat souhaité.
    En effet rien ne garantit que les identifiants soient attribués dans l'ordre chronologique des livraisons, du coup, faute d'attribut permettant d'horodater les livraisons, la notion de "dernière livraison" ne peut pas être matérialisée !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut Donnée horodatee
    Je vous remercie pour votre réponse, mes tables contiennent toutes la colonne date (date de commande) et (date de livraison) mais je n'ai pas pu comparer avec le plus haut numéro de livraison, donc comment la date pourrait m'aider ?
    Merci encore

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 633
    Billets dans le blog
    10
    Par défaut
    De nombreuses solutions possibles, en voici une :

    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
    WITH CTE1 (RANG, IDCDE, IDLIV, CDART, DTLIV, QTLIV) AS (
         select dense_rank()
                over(partition by CDE.id_commande, LIV.id_livraison
                     order by LIV.date_liv DESC) 
              , CDE.id_commande 
              , LIV.id_livraison
              , CDE.code_article
              , LIV.date_livraison
              , LIV.Qty1
         from commande_client as CDE
         inner join livraison as LIV
           on  liv.id_commande = CDE.id_commande)
    SELECT IDCDE
         , IDLIV
         , CDART
         , DTLIV
         , QTLIV
    FROM CTE1
    WHERE RANG = 1
    ORDER BY IDCDE, CDART

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 633
    Billets dans le blog
    10
    Par défaut
    Un point auquel je n'avais pas prêté attention : la modélisation de vos tables est incorrecte, vous devriez avoir par exemple

    COMMANDE (id_commande PK, num_commande, date_commande, id_client FK....)
    COMMANDE_LIGNE(id_commande PK, id_ligne PK, id_article FK, quantite_cde....)
    LIVRAISON(id_commande PK, id_ligne PK, id_liv PK, date_livraison, quantite_livree, id_fournisseur FK...)

    Avec votre modèle, id_commande n'est pas unique et id_client est redondant ...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut Erreur
    Merci encore,

    Voici l'erreur que j'ai eu après exécution de la requête:

    Msg 4104, Level 16, State 1, Line 12
    The multi-part identifier "LIV.id_livraison" could not be bound.


    Sur les champs (CDE.id_commande, LIV.id_livraison, CDE.code_article, LIV.date_livraison, LIV.Qty1)

Discussions similaires

  1. Fermeture des requêtes SQL Server
    Par zwina2004 dans le forum Bases de données
    Réponses: 5
    Dernier message: 26/10/2007, 16h17
  2. [Requête] SQL SERVER 2000 / Transact SQL
    Par plutonium719 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/09/2007, 17h56
  3. Aidez moi pour une requête SQL server
    Par pop10 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 19/06/2007, 22h15
  4. Réponses: 2
    Dernier message: 04/04/2006, 11h46

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