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 :

Requete complexe


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut Requete complexe
    Bonjour et désolé pour le titre mais je voyais pas trop quoi mettre

    J'ai 3 tables (euh en fait plus mais seulement ces 3 la sont concernées) :

    • Disque :

      disque_id clé primaire
      dsq_qte_stock quantité en stock de ce disque
      dsq_code_barre code barre du disque
      ...


      Variation de stock -> tous les ajouts en stocks(+) ou régularisation(+ ou -) (mais pas les ventes):

      variationstockid clé primaire
      var_quantite quantité ajouté ou enlevé
      var_disque_id clé étrangère vers la table disque
      ...


      Lignepanier -> toutes les lignes de vente (la quantité est toujours 1) :

      lignepanier_id clé primaire
      lpa_disque_id clé étrangère vers la table disque
      ...


    ce que je veut faire c'est lister tous les disques ayant une quantite en stock (champ dsq_qte_stock) incoherante par rapport à l'historique des ventes et des achats.

    En plus clair, je dois lister tous les disques dont le total des var_quantite moins le nombre de lignepanier est différent de la dsq_qte_stock


    voici la requete que j'ai testé :
    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
    33
    34
    35
     
    select 
    		disque_id, 
    		dsq_code_barre as code_barre, 
    		sum(var_quantite) as variation_stock, 
    		count(lignepanier_id) as ventes,
    		dsq_qte_stock as qte_stock,
    		(sum(var_quantite) - count(lignepanier_id)) as qte_stock_calcule
    from 
    		variationstock, 
    		lignepanier, 
    		disque disques
    where 
    		var_disque_id = disque_id
    and 
    		disque_id = lpa_disque_id
    and 
    		dsq_qte_stock != 	
    		(
    			select sum(var_quantite)
    			from variationstock, disque
    			where var_disque_id = disque_id
    			and disque_id = disques.disque_id
    		)
    		-
    		(
    			select (count(lignepanier_id))
    			from lignepanier, disque
    			where disque_id = lpa_disque_id
    			and disque_id = disques.disque_id
    		)
    group by 	
    		disque_id, 
    		dsq_code_barre,
    		dsq_qte_stock

    avec cette requete je n'ai pas le résultat escompté et je ne vois pas ce qu'il faut faire.

    En fait c'est le calcul de la variation de stock et des ventes qui pose problème. Après quelques tests je me suis appercu que le total des variations de stock que j'obtien est égale à lui même * le total des ventes. je n'est pas réussi à déterminé ce qu'il en était pour le calcul des ventes...

    merci d'avance...

  2. #2
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut le combien_qu_on_ma_chouré.sql
    et un truc du genre
    l'idée est de prendre en compte l'ensemble des variations (V) par disque et l'ensemble des lignes de vente (L) par disque en jointure avec la table des Disques D
    Ensuite de ne sortir que les disques dont la qté en stock est diférente de ( la sum des variations (En + ou en -) moins le nombre (count(*) 1 seul disque par vente ) de ligne de vente du disque)
    J'ai bien compris ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Select  
             D.disque_id, D.dsq_qte_stock , V.sum_variation - L.count_les_lignes
    from
             (Select var_disque_id , sum(var_quantité) sum_variation
              From Variation
              Group by var_disque_id ) V ,
             (Select var_disque_id,count(*) count_les_lignes
              From 
              Ligne_Panier ) L ,
             Disque D
    Where 
             D.disque_id = V.var_disque_id And
             D.disque_id = L.var_disuqe_id And
             D.dsq_qte_stock != (V.sum_variation - L.count_les_lignes)
    Signé : Capitaine Jean-Luc Picard

  3. #3
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut
    ouai t'as bien cerné le problème lorsque j'ai testé, une erreur survient "var_disque_id : nom de colone incorrect"

    j'connaissai pas ce genre de sous requête, merci !

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 774
    Points : 52 747
    Points
    52 747
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    La solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT disque_id
    FROM   Disque D
    GROUP  BY disque_id,
    HAVING SUM(dsq_qte_stock) <> (SELECT sum(var_quantite)
                                  FROM   Variation_de_stock S
                                  WHERE  S.var_disque_id = D.disque_id
                                  GROUP BY S.var_disque_id )
    Au passage : cette base a été visiblement construite par un porc :
    Nom des colonnes PK et FK différentes (Pourquoi ???), nom d'objet avec des blancs... Et comme l'induit ta demande pas d'intégrité ni de contrôle par des déclencheurs...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut
    merci SQLPro mais contrairement à argoet, je crois que tu n'as pas du tout cerner le problème

    l'équation c'est :

    somme des variations de stock d'un disque - nb de lignes de panier de ce dique <> quantite en stock du même disque

    en ce qui concerne la construction de la base, ce n'est pas moi qui l'ai faite, c'est un sujet que je reprend... pour les PK et FK, c'est la norme de la boite qui veut ca et je trouve ca plutôt bien...

  6. #6
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut
    j'ai modifié ta requete comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT disque_id
    FROM   Disque D, lignepanier
    GROUP  BY disque_id, dsq_qte_stock
    HAVING (dsq_qte_stock+count(lignepanier_id)) <>
                                  (SELECT SUM(var_quantite)
                                  FROM   Variationstock S
                                  WHERE  S.var_disque_id = D.disque_id
                                  GROUP BY S.var_disque_id )
    et j'ai encore une erreur "var_disque_id : nom de colone incorrect" je comprend pas...

  7. #7
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut Good Syntaxe : Avec ORACLE
    Avec ORACLE : Good Syntaxe
    Exemple

    Je repete c'est juste un exemple !!!

    Les disques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Create Table Disque
    (
    Disque_id varchar2(13) ,
    dsq_qte_stock number
    );
     
    insert into disque values('DSK1',10);
    insert into disque values('DSK2',20);
    insert into disque values('DSK3',1);
     
    Ligne_Panier
    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
    Create Table Ligne_Panier
    (
    lpa_disque_id  varchar2(13) ,
    lpa_date_vente date
    );
     
    insert into Ligne_panier values('DSK1',sysdate);
    insert into Ligne_panier values('DSK1',sysdate);
    insert into Ligne_panier values('DSK1',sysdate);
    insert into Ligne_panier values('DSK1',sysdate);
    insert into Ligne_panier values('DSK1',sysdate);
     
    insert into Ligne_panier values('DSK2',sysdate);
    insert into Ligne_panier values('DSK2',sysdate);
    insert into Ligne_panier values('DSK2',sysdate);
    insert into Ligne_panier values('DSK2',sysdate);
    insert into Ligne_panier values('DSK2',sysdate);
    Variation
    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
    Create Table Variation
    (
    var_disque_id varchar2(13),
    var_quantite number
    );
     
    insert into Variation values('DSK1',-10);
    insert into Variation values('DSK1',+02);
    insert into Variation values('DSK1',+02);
    insert into Variation values('DSK1',+02);
    insert into Variation values('DSK1',+02);
    insert into Variation values('DSK1',+02);
     
    insert into Variation values('DSK2',-10);
    insert into Variation values('DSK2',-10);
    Signé : Capitaine Jean-Luc Picard

  8. #8
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut La requete
    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
    Select
             D.disque_id, D.dsq_qte_stock , V.sum_variation - L.count_les_lignes
    from
             (Select var_disque_id , sum(var_quantite) sum_variation
              From Variation
              Group by var_disque_id ) V ,
             (Select lpa_disque_id,count(*) count_les_lignes
              From
              Ligne_Panier
              Group by lpa_disque_id ) L ,
             Disque D
    Where
             D.disque_id = V.var_disque_id And
             D.disque_id = L.lpa_disque_id And
             D.dsq_qte_stock != (V.sum_variation - L.count_les_lignes);
    Signé : Capitaine Jean-Luc Picard

  9. #9
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Le résultat :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Table created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    Table created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    Table created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    1 row created.
     
     
    DISQUE_ID     DSQ_QTE_STOCK V.SUM_VARIATION-L.COUNT_LES_LIGNES
    ------------- ------------- ----------------------------------
    DSK1                     10                                 -5
    DSK2                     20                                -25
    Signé : Capitaine Jean-Luc Picard

  10. #10
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut


    ca marche !

    merci argoet

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

Discussions similaires

  1. [SQL2] Requête complexe
    Par benwit dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/05/2006, 19h52
  2. Aide requete complexe
    Par Sabine78 dans le forum Access
    Réponses: 9
    Dernier message: 18/04/2006, 21h28
  3. requete complexe
    Par nicohugo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2006, 08h10
  4. Requete complexe
    Par Pfeffer dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/02/2005, 17h42
  5. requete complexe
    Par Thunder_nico dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/10/2004, 11h36

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