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 :

Etablir une requête SQL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 39
    Points : 23
    Points
    23
    Par défaut Etablir une requête SQL
    Bonjour la communauté,

    J'ai tous ces éléments ci-dessous et je n'arrive pas à obtenir le résultat correspondant. Il est vrai que je suis débutant en SQL mais aidez-moi s'il vous plaît. voici les éléments :
    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
    32
     
     
    * @date = '2023-12-20'
    *@parc
     
    lettrevoiture
    Idlv | lieuxdepart | date de départ | lieuxarriver | date d'arrivée
    ------- | -------- | -------- | -------- | ---------
    1 | Parc 1 | 2023-12-12 | Parc 6 |2023-12-14
    2 | Parc 6 | 2023-12-18 | Parc 1 |2023-12-20
     
    lettrevoitureligne
    idlvr | Idlv | idbille
    ------| ------| ---------
    1 | 1 | 206
    2 | 1 | 208
    3 | 2 | 208
    4 | 2 | 206
     
    bille
    idbille | numéro
    ------- | ---------
    1 | 206
    2 | 208
     
    Résultat de la requête qui relie les trois tables
    idlvr | Idlv | idbille | lieuxdepart | date de départ | lieuxarriver | date d'arrivée
    ------| -----| ------- | ------------| -------- | -------- | ---------
    1 | 1 | 206 | Parc 1 | 2023-12-12 | Parc 6 |2023-12-14
    2 | 1 | 208 | Parc 1 | 2023-12-12 | Parc 6 |2023-12-14
    3 | 2 | 208 | Parc 6 | 2023-12-18 | Parc 1 |2023-12-20
    4 | 2 | 206 | Parc 6 | 2023-12-18 | Parc 1 |2023-12-20
    je souhaite faire une requête pour avoir le stock à date des billes arrivées sur un parc @parc à une date @date en excluant les billes qui ont quitté le parc @parc jusqu'à ce jour @date.

    je vous prie de m'aider. je suis disponible pour plus de compréhension.

    merci,

  2. #2
    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 803
    Points
    30 803
    Par défaut
    Bonjour,

    Qu'as-tu déjà testé comme requête(s) ?
    Où rencontres-tu un problème ?
    • Une erreur d'exécution ? Quel est le message associé ?
    • Un résultat erroné ? Quel est le résultat obtenu ? Le résultat attendu ?
    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.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 39
    Points : 23
    Points
    23
    Par défaut
    merci @al1_24 pour ta préoccupation. Mais voici le code que j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT b.idbille, v.lieuxdepart, v.datedepart, v.lieuxarriver, v.datearrive FROM lettrevoitureligne l JOIN lettrevoiture v ON l.idlv = v.idlv 
    JOIN bille b on b.idbille = l.idbille WHERE v.lieuxarriver = @parc 
    AND v.datearrive <= @date 
    AND b.idbille NOT IN
    ( SELECT idbille FROM lettrevoitureligne l2 JOIN lettrevoiture v2 ON v2.idlv = l2.idlv WHERE v2.datedepart <= @date AND v2.lieuxdepart = @parc )
    alors lorsque j'execute cette requête pour @parc = 'Parc 1' à la date du @date = '20/12/2023' j'ai un resultat null car la deuxième conditions vient annuler la première. car la première condition sélectionne les billes qui sont arrivées sur le Parc 1 jusqu'au 20/12/2023 ce qui est normal car si vous regardez le tableau ci-dessus vous verrez que les billes sont arrivées sur le parc 1 le 20/12/2023. ensuite, la deuxième sous-requête permet d'enlever les billes qui sont partir sur ce parc(parc 1) jusqu'au 20/12/2023. donc le resultat null est normal car les mêmes billes sont d'abord partir du parc 1 le 12/12/2023. du coup je ne sais comment faire pour que ça m'affiche les billes arrivées sur le parc au 20/12/2023.

    merci,

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    J'avoue avoir du mal à comprendre ce qui est attendu, est ce que le dernier tableau communiqué le 1er message est ce résultat attendu ?

    Quoi qu'il en soit, pour calculer un stock, il faut faire l'opération suivante :

    Nouveau STOCK = STOCK initial - somme(sorties) + somme(entrées)

    Et bien évidemment, il faut connaitre la date du stock initial, pour prendre en compte tous les mouvements depuis cette date

    Or, je ne vois pas où est stocké le stock initial dans vos table, ni la date de ce stock...

    Question subsidiaire : c'est quoi ces "billes" ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 39
    Points : 23
    Points
    23
    Par défaut
    merci @escartefigue. en réalité le nom stock c'est un terme technique.
    ici il s'agit de faire une requête des billes étant arrivées sur un lieu et à une date arrivée. seulement ces billes pour arriver sur un lieu ont besoin d'être transportés par des camions appelé lettrevoiture et une lettrevoiture contient plusieurs lignes appelées lettrevoitureligne. c'est sur ces lettrevoiturelignes qu'on retrouve les billes.

    cependant, il peut arrivé qu'une bille soit arrivée sur lieu(parc) le 20/12/2023 mais le 19/12/2023 d'autres billes aient quitté le parc. c'est pourquoi la deuxième sous-requête enlève les billes qui sont partir du parc jusqu'à la date de calcul.

    j'espère avoir mieux expliqué le contexte sinon je reste disponible.

    merci d'avance.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Quelques remarques préalables :

    Pour nommer les objets bases de données (les tables, vues, colonnes, triggers...), il est préférable d'éviter les caractères spéciaux tels que les blancs, les apostrophes, les caractères accentués, etc.
    Ça évite de devoir encadrer ces noms par des guillemets ce qui simplifie les requêtes.
    Également, attention à l'orthographe, les tables, vues et colonnes sont utilisées partout, si une coquille orthographique se glisse dans un nom, on la trimbale donc partout (exemple lieuarriver )
    Pour les tables, comme elle sont issues d'un type d'entité au niveau conceptuel, et qu'on se doute bien que chaque table peut contenir plusieurs lignes, on les nomme donc au singulier.
    De même, pour les colonnes, comme chaque ligne ne contient qu'une et une seule valeur, on les nomme aussi au singulier, soit "lieuarrivee" plutôt que lieuxarriver"

    Ensuite, la ligne de lettre de voiture n'existe pas sans la lettre de voiture correspondante. C'est ce qu'on appelle un type d'entité faible.
    Ce faisant, il est fortement recommandé d'identifier la ligne relativement à la lettre. Concrètement, ça se matérialise par le fait que la clef primaire de la ligne se compose en majeur de la clef étrangère identifiant la lettre complétée d'un chrono.
    Ce chrono redémarre à zéro ou à un à chaque nouvelle lettre, il n'est pas unique seul.
    Le gros avantage de ce type d'identification, c'est qu'avec la PK déclarée comme index cluster, toutes les lignes d'une même lettre seront rangées physiquement dans un espace contigu, au grand bénéfice des performances.

    Ce préambule posé, voici une solution à votre besoin (j'ai enrichi votre jeu d'essai un peu pauvre avec quelques cas supplémentaires, et renommé les objets pour éviter les caractères spéciaux) :
    Comme vous n'avez pas précisé votre SGBD, ici c'est une solution SQL server, mais facile à transposer vers d'autres SGBD

    Code SQL : 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
    32
    33
    34
    35
    36
    37
    38
    39
    declare @park char(6)    ;
    set @park = 'Parc 3'     ;
    declare @date date       ;
    set @date = '2023-12-18' ;
     
    with  LV_lvoit(LV_ident, LV_lieudep, LV_dtdep, LV_lieuarr, LV_dtarr)
      as (select 1, 'Parc 1', '2023-12-12', 'Parc 6', '2023-12-20'   union all
          select 2, 'Parc 6', '2023-12-18', 'Parc 1', '2023-12-20'   union all 
          select 3, 'Parc 2', '2023-12-15', 'Parc 3', '2023-12-18'   union all 
          select 4, 'Parc 6', '2023-12-16', 'Parc 3', '2023-12-17'
        )
       ,  LL_ligne (LV_ident, LL_seq, BI_ident)
      as (select 1, 1, 206  union all
          select 1, 2, 208  union all
          select 2, 1, 208  union all
          select 2, 2, 206  union all
          select 3, 1, 300  union all
          select 4, 1, 400
        )
    select subq.LV_lieuarr
         , sum(subq.nbr) 
    from 
      (select LV.LV_ident
            , LL_seq
            , LV_lieudep
            , LV_lieuarr  
            , case when LV_lieudep = @park then -1
                   when LV_lieuarr = @park then +1
                   else 0
              end as nbr
       from       LV_lvoit  as LV
       inner join LL_ligne  as LL
          on LL.LV_ident = LV.LV_ident  
       where LV_dtdep <= @date
         and LV_dtarr >= @date
      ) subq
    where subq.LV_lieuarr=@park  
    group by subq.LV_lieuarr   
    ;

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2016
    Messages : 39
    Points : 23
    Points
    23
    Par défaut
    merci pour tes remarques et ta solution proposée en Sql Server mais si je dois l'implémenter avec MySQL ça donne quoi ?

    aussi peux-tu m'expliquer ta query stp pour que je puisse bien comprendre.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    En MYSLQ, la requête sera identique à celle proposée, à l'exception de la déclaration des variables à faire sous la forme

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select @park := 'Parc 3'     ;
    select @date := '2023-12-18' ;

    Dans la requête proposée :

    • la déclarative WITH me sert ici à construire deux Common Table Expression (CTE) : c'est pratique pour créer un jeu d'essai quand on n'a pas le script CREATE TABLE + INSERT ;
    • la requête imbriquée compte les sorties (-1) et les entrées (+1) en comparant les valeurs des colonnes lieu de départ et lieu d'arrivée avec le code lieu en paramètre et en appliquant la restriction sur la période ;
    • la requête englobante calcul la somme de ces entrées et sorties et filtre sur le lieux souhaité.


    Note : quand on répond au dernier message dans son intégralité, il faut utiliser le bouton "répondre à la discussion" (tout en bas) et non pas "répondre avec citation"

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 103
    Points : 8 216
    Points
    8 216
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par romyney Voir le message
    merci pour tes remarques et ta solution proposée en Sql Server mais si je dois l'implémenter avec MySQL ça donne quoi ?
    aussi peux-tu m'expliquer ta query stp pour que je puisse bien comprendre.
    La syntaxe de 8h de escartefigue est presque entièrement supportée par MySQL 8. La seule différence tient aux instructions declare qu'il suffit de supprimer.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

Discussions similaires

  1. probleme soustraction sur une requte sql
    Par kroma23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/06/2011, 13h27
  2. Réponses: 5
    Dernier message: 06/10/2009, 09h37
  3. Réponses: 4
    Dernier message: 11/06/2009, 16h03
  4. comment parametrer une requte sql ds ireport
    Par hamzuss dans le forum Jasper
    Réponses: 3
    Dernier message: 17/03/2009, 20h01
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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