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 :

Petite question sur une requete


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut Petite question sur une requete
    Bonjour à tous,

    J'ai une requête que je ne sais réaliser.
    J'ai une table produit :
    Prod #1
    Prod#2
    ...

    Une table présence (pour savoir si le produit est présent) :
    Prod#1 ; Oui
    Prod#1 ; Oui
    Prod#2 ; Oui
    Prod#2 ; Non

    Est-il possible en une requête d'avoir pour chaque produit le nombre de présence et d'absence :
    Prod#1 ; 2(présent) ; 0 (absent)
    Prod#2 ; 1; 1


    Je pense pouvoir le faire mais avec deux sous requêtes une qui compte le nombre de Oui et l'autre qui compte le nombre de non mais il n'y a pas mieux ?

    Merci

  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 394
    Points
    18 394
    Par défaut
    Une requête de ce type-là fera l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select produit,
             sum(case choix when 'Oui' then 1 else 0 end) as nb_oui,
             sum(case choix when 'Non' then 1 else 0 end) as nb_non
        from presence
    group by produit

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Effectivement bien moins long que ma solution !

    Merci !

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut Complément à cette demande
    (Re)Bonjour,

    J'ai une petite question complémentaire, j'effectue la requête suivante :

    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 p.id_produit,  p.code_produit,  rp.id_reporting_prod, m.nom_mois,
       SUM(case rp.present when 'Oui' then 1 else 0 end) AS oui,
       SUM(case rp.present when 'Non' then 1 else 0 end) AS non
    FROM produit_referencement r
    CROSS JOIN mois m
    LEFT JOIN produit p ON p.id_produit=r.id_produit
    LEFT JOIN reporting_produit rp ON rp.id_produit=r.id_produit
    LEFT JOIN planning pl ON pl.id_planning=rp.id_planning  
      AND m.num_mois = EXTRACT(MONTH FROM pl.date_rdv)
     
    $critere_ens
     
    GROUP BY r.id_produit, m.id_mois
    ORDER BY p.id_produit, m.id_mois
    Ca me donne des résultats :
    Mois;ID_produit;Somme des Oui; Somme des non

    Le filtre par mois ne s'effectue pas, la somme des oui ou des non est identique pour tout les mois, mais par produit cela fonctionne.

    Je ne vois pas trop ou ça cloche, au niveau du sum je suppose ?
    Merci d'avance de votre aide.

  5. #5
    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 394
    Points
    18 394
    Par défaut
    Pourquoi des jointures externes ?

    Pourquoi un produit cartésien alors qu'un peu plus loin vous avez quelque chose qui ressemble très fortement à un prédicat de jointure ?

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Ben en fait je fais des jointures externes car je veux afficher tous les mois et toues les produits même si il n'y a pas d'entré.

    Pour la deuxième question euhh j'ai pas tout compris

    Merci.

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 804
    Points : 34 077
    Points
    34 077
    Billets dans le blog
    14
    Par défaut
    Tu veux tous les produits et tous les mois donc ce sont ces tables là qu'il faut mettre en extrémité de la chaîne des jointures.
    Tu peux essayer celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT p.id_produit,  p.code_produit,  rp.id_reporting_prod, m.nom_mois,
       SUM(case rp.present when 'Oui' then 1 else 0 end) AS oui,
       SUM(case rp.present when 'Non' then 1 else 0 end) AS non
    FROM planning pl
    RIGHT JOIN reporting_produit rp ON rp.id_planning = pl.id_planning
      RIGHT JOIN produit_referencement r ON r.id_produit = rp.id_produit
        RIGHT JOIN produit p ON p.id_produit = r.id_produit
    RIGHT JOIN mois m ON m.num_mois = EXTRACT(MONTH FROM pl.date_rdv)
     
    $critere_ens -- Euh... c'est une clause WHERE ?
     
    GROUP BY r.id_produit, m.id_mois
    ORDER BY p.id_produit, m.id_mois

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Je te remercie, je ais essayer ça et je te tiens au courant.
    $critere_ens est une clause AND, si je met un WHERE, ça me liste que les lignes ou il y a eu des enregistrements.

    Merci encore.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Je viens d'essayer l'adaptation de ta solution, mais je ne sais pas si j'ai bien formulé ma demande.

    En effet j'ai une table mois et enseigne et je cherche pour chaque enseigne liste tout les mois sans exceptions afin d'établir le nombre de présence produit (table reporting_produit elle est liée à la table planning ou la date de rdv est présente)

    Donc comme résultat je cherche à avoir :


    Enseigne#1;Janvier;2
    Enseigne#1;Février;2
    ...[tous les autres mois]
    Enseigne#1;Décembre;0

    Enseigne#2;Janvier;0
    ...[tous les autres mois]
    Enseigne#2;Décembre;0


    Avec CROSS JOIN je m'en sortais pas mal, car avec une jointure RIGHT JOIN si il n'y a pas de date pour le mois de juillet par exemple il va pas me le sortir ?

    A priori je veux le produit cartésien de la table mois et enseigne (ou produit, ou mag peu importe)

    Merci d'avance de votre aide.

  10. #10
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 804
    Points : 34 077
    Points
    34 077
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par dam28800 Voir le message
    En effet j'ai une table mois et enseigne
    C'est la première fois que tu nous parles d'une table enseigne !

    et je cherche pour chaque enseigne liste tout les mois sans exceptions afin d'établir le nombre de présence produit (table reporting_produit elle est liée à la table planning ou la date de rdv est présente)

    Donc comme résultat je cherche à avoir :


    Enseigne#1;Janvier;2
    Enseigne#1;Février;2
    ...[tous les autres mois]
    Enseigne#1;Décembre;0

    Enseigne#2;Janvier;0
    ...[tous les autres mois]
    Enseigne#2;Décembre;0
    Ton besoin a donc changé ! Au départ, c'était ça :
    Est-il possible en une requête d'avoir pour chaque produit le nombre de présence et d'absence :
    Prod#1 ; 2(présent) ; 0 (absent)
    Prod#2 ; 1; 1
    Alors donne nous la structure de toutes les tables nécessaires à ton besoin parce que je ne vois pas d'enseigne dans la requête que tu nous as donnée.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Oui c'est vrai pas très clair mon histoire...

    Alors en fait je construits un tableau à double entrée en PHP à partir de ma requête.

    Donc dans un premier temps j'ai en ligne les enseignes et en colonne les mois, le croisement des deux donne le nombre de référence absente (champ Rupture) la requête ressemble à ça et elle fonctionne :
    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
     
    SELECT  e.id_enseigne AS ID_Ligne,
            e.nom_enseigne AS Name_Ligne,
            COALESCE(COUNT(rp.id_reporting_prod), 0) AS Nb_Prod,
            SUM(case rp.stock when '0' then 1 else 0 end) AS Rupture,
            m.num_mois
     
    FROM pdv_enseigne e
     
    CROSS JOIN mois m                                        
     
    LEFT JOIN pdv
    ON pdv.enseigne=e.id_enseigne
     
    LEFT JOIN planning p
    ON p.id_pdv=pdv.id_pdv                                            
     
    LEFT JOIN reporting_produit rp
    ON rp.id_planning=p.id_planning
    AND m.num_mois=EXTRACT(MONTH FROM p.date_rdv)
    AND YEAR(p.date_rdv)='".$annee."'
     
    GROUP BY e.id_enseigne, m.id_mois
    ORDER BY e.nom_enseigne, m.id_mois
    Ensuite lorsque je clique sur la ligne d'une enseigne j'ai le détail par magasin, cela génère une nouvelle requête qui liste les magasins de l'enseigne, la requête est ci-dessous et elle fonctionne :

    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
    SELECT  pdv.id_pdv AS ID,
            m.num_mois,
            m.nom_mois,
            CONCAT(e.nom_enseigne, ' ',pdv.nom) AS Magasin_d,
            COALESCE(COUNT(rp.id_reporting_prod), 0) AS Nb_Prod,
            SUM(case rp.stock when '0' then 1 else 0 end) AS Rupture
     
    FROM pdv
     
    CROSS JOIN mois m                                    
     
    LEFT JOIN planning p
    ON p.id_pdv=pdv.id_pdv                                            
     
    LEFT JOIN reporting_produit rp
    ON rp.id_planning=p.id_planning
    AND m.num_mois=EXTRACT(MONTH FROM p.date_rdv)
    AND YEAR(p.date_rdv)='".$annee."'
     
    JOIN pdv_enseigne e
    ON pdv.enseigne=e.id_enseigne
    AND pdv.enseigne='".$_GET['id']."'
     
    GROUP BY pdv.id_pdv, m.num_mois
    ORDER BY pdv.nom, m.num_mois
    $_GET['id'] est l'enseigne posté avant.

    Ensuite lorsque je clique sur le magasin, je dois faire une nouvelle requête qui liste les produits en rupture sur le magasin, cette requête marche mal, elle m'affiche bien les produits met elle ne tient pas en compte des mois (il s'affiche mais tous à un alors qu'il n'y a qu'une rupture en février), la voici ci-dessous :


    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
    SELECT  pr.id_produit AS ID,
            m.num_mois,
            m.nom_mois,
            prod.code_produit AS Produit,
            COALESCE(COUNT(rp.id_reporting_prod), 0) AS Nb_Prod,
            SUM(case rp.stock when '0' then 1 else 0 end) AS Rupture
     
    FROM produit_referencement pr
    LEFT JOIN reporting_produit rp
    ON rp.id_produit=pr.id_produit
     
    CROSS JOIN mois m    
     
     
     
    LEFT JOIN planning p
    ON rp.id_planning=p.id_planning                                            
    AND m.num_mois=EXTRACT(MONTH FROM p.date_rdv)
    AND YEAR(p.date_rdv)='".$annee."'
     
     
     
    LEFT JOIN produit prod
    ON prod.id_produit=rp.id_produit
     
     
    LEFT JOIN pdv
    ON pdv.id_pdv=p.id_pdv
    AND pdv.id_pdv='".$_GET['ssid']."'
     
    WHERE pr.id_enseigne='".$_GET['id']."'
     
    GROUP BY pr.id_produit, m.num_mois
    ORDER BY pr.id_produit, m.num_mois
    $_GET['ssid'] est l'id du magasin


    Voici les tables que j'ai :

    Enseigne : id_enseigne; enseigne
    Magasin : id_pdv; enseigne
    Planning : id_planning; id_pdv;date
    Produit : id_produit; code
    Produit_referencement : id_produit; id_enseigne (produit a afficher pour une enseigne)
    Reporting_produit : id; id_planning; id_produit; rupture

    Voilà j'espère que c'est plus clair, merci d'avance de votre aide.

Discussions similaires

  1. [MySQL] Petite question sur une erreur de mysql
    Par iwf-fr dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/12/2006, 17h23
  2. [SQL Server] Une petite aide sur une requete
    Par irenee dans le forum Langage SQL
    Réponses: 9
    Dernier message: 24/04/2006, 17h08
  3. Petite question sur une IHM
    Par beb30 dans le forum MFC
    Réponses: 12
    Dernier message: 10/04/2006, 16h19
  4. [VB2003][ACCESS] Question sur une requete
    Par Kanie dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2006, 18h25
  5. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 16h17

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