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

 MySQL Discussion :

Requête mysql


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut Requête mysql
    bonjour,
    je debute en mysql et je galère pour pas grand chose je pense!

    Voici ma requete

    le but du jeu est de sortir tous les objets qui ont un statut = 4 de 2011 et qui ont une date souhaitee >= date realisation et la meme requete pour le contraire <

    1-ma requete me sors bien les 2 select mais lorsque je veux faire un export en csv pour excel, je n'ai que du code et pas ma liste!

    2-je voudrais en plus que pour chaque enregistrements de la premier requete select, la valeur du champ CAT soit remplacée par HSLA et dans la deuxieme, par SLA afin que je puisse en fair eun histogramme

    Merci pour votre aide!
    .
    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 table_demande.Num_Demande, table_famille.Libelle_Famille, table_objet.Libelle_Objet, table_objet.Acces_GR AS CAT, count( "CAT" ) AS HLSA, table_demande.Date_Souhaitee_Realisation, table_statut_demande.Date_Statut
    FROM table_demande, table_statut_demande, table_famille, table_objet
    WHERE table_demande.Num_Demande = table_statut_demande.Num_demande
    AND table_famille.Num_Famille = table_demande.Num_Famille
    AND table_objet.Num_Objet = table_demande.Num_Objet
    AND table_objet.Acces_GR = "CAT"
    AND table_demande.Num_Statut =4
    AND year( Date_Souhaitee_Realisation ) = "2011"
    AND table_demande.Date_Souhaitee_Realisation < table_statut_demande.Date_Statut
    GROUP BY `Num_Demande` 
    )
    UNION (
     
    SELECT table_demande.Num_Demande, table_famille.Libelle_Famille, table_objet.Libelle_Objet, table_objet.Acces_GR AS CAT, count( "CAT" ) AS SLA, table_demande.Date_Souhaitee_Realisation, table_statut_demande.Date_Statut
    FROM table_demande, table_statut_demande, table_famille, table_objet
    WHERE table_demande.Num_Demande = table_statut_demande.Num_demande
    AND table_famille.Num_Famille = table_demande.Num_Famille
    AND table_objet.Num_Objet = table_demande.Num_Objet
    AND table_objet.Acces_GR = "CAT"
    AND table_demande.Num_Statut =4
    AND year( Date_Souhaitee_Realisation ) = "2011"
    AND table_demande.Date_Souhaitee_Realisation >= table_statut_demande.Date_Statut
    GROUP BY `Num_Demande` 
    )

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis 1992 selon la norme SQL avec l'opérateur JOIN !

    2) Avec des alias, la requête devient plus lisible.

    3) La fonction YEAR donne en entier ; inutile de le comparer à la chaîne de caractères "2011"

    4) Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de regroupement doivent figurer dans le GROUP BY, sinon vous aurez des données aléatoires dans les colonnes manquantes !

    5) Dans une requête aux multiples jointures, il vaut mieux préciser de quelles tables proviennent toutes les colonnes citées.

    6) En faisant count( "CAT" ) AS HLSA, vous demandez de compter la chaîne de caractères "CAT". Ça m'étonnerait que le résultat fourni soit celui que vous espérez !
    Si vous voulez compter les lignes répondant aux conditions, faites simplement un COUNT(*).

    7) Au fait, en SQL, les chaînes de caractères s'entourent d'apostrophes, pas de guillemets.

    le but du jeu est de sortir tous les objets qui ont un statut = 4 de 2011 et qui ont une date souhaitee >= date realisation et la meme requete pour le contraire
    Vous voulez sortir la liste de tous les objets répondant à ces conditions ou seulement les compter ?
    Parce que si vous voulez les objets répondant à une condition et les objets répondant à la condition inverse, vous demandez en fait tous les objets !

    Voici votre première sous-requête récrite :
    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.Num_Demande, 
        f.Libelle_Famille, 
        o.Libelle_Objet, o.Acces_GR AS CAT, 
        count( 'CAT' ) AS HLSA, 
        d.Date_Souhaitee_Realisation, 
        sd.Date_Statut
    FROM table_demande d
    INNER JOIN table_statut_demande sd ON d.Num_Demande = sd.Num_demande
    INNER JOIN table_famille f ON f.Num_Famille = d.Num_Famille
    INNER JOIN table_objet o ON o.Num_Objet = d.Num_Objet
    WHERE o.Acces_GR = 'CAT'
        AND d.Num_Statut = 4
        AND YEAR ( Date_Souhaitee_Realisation ) = 2011
        AND d.Date_Souhaitee_Realisation < sd.Date_Statut
    GROUP BY d.Num_Demande, f.Libelle_Famille, o.Libelle_Objet, o.Acces_GR, d.Date_Souhaitee_Realisation, sd.Date_Statut
    Ne voulez-vous pas en fait compter, parmi les objets d'Acces_GR "CAT", de statut 4 et de date souhaitée de réalisation 2011, ceux qui sont en retard et ceux qui ne le sont pas ?
    Dans ce cas, vous pouvez le faire en une seule requête en utilisant CASE et en faisant la somme des CASE une condition et des CASE la condition inverse.
    Il y a déjà eu des comptages similaires traités sur le forum MySQL/Débuter, MySQL/Requêtes ou Langage SQL tout récemment.

    Revenez si besoin avec un besoin plus clair et un jeu de données exemple et le résultat attendu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut essai
    bonjour,
    je vous remercie pour votre aide, la requete s'execute en un temps record, mais j'ai encore des doublons de Num_demande qui me faussent le resultat de la requete. J'ai demandé à faire une formation SQL, mais ça tarde

    Le but de cette requete est d'analyser la qualité de nos prestations à savoir demandes executées dans les delais ou non, d'en sortir le nombre par objets ainsi que les pourcentage de realisation par objets dans les temps (SLA).

    Ce que je veux faire, c'est bien lister tous les objets qui sont de statut 4 et de 2011 et de reperer ceux qui sont hsla donc date_souhaitée < à date_statut (qui est la date de cloture de la demande) en ecrivant HSLA, ou SLA quand la condition est >= dans une colonne qu'on appelerait "Delais".
    En meme temps, j'aimerais compter le nombre de SLA et de HSLA par regroupement d'Objet et en sortir le % par rapport au total des objets.

    (on peut supprimer la colonne CAT mais pas le critere ainsi que le count () actuel)
    merci!

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    j'ai encore des doublons de Num_demande qui me faussent le resultat de la requete
    Cela veut probablement dire que pour une demande il peut y avoir plusieurs statuts ?

    Allons-y par étapes...
    lister tous les objets qui sont de statut 4 et de 2011
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT o.Libelle_Objet
        d.Date_Souhaitee_Realisation,
    FROM table_demande d
    INNER JOIN table_objet o ON o.Num_Objet = d.Num_Objet
    WHERE d.Num_Statut = 4
        AND YEAR ( d.Date_Souhaitee_Realisation ) = 2011
    on peut supprimer la colonne CAT mais pas le critere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT o.Libelle_Objet
        d.Date_Souhaitee_Realisation,
     FROM table_demande d
    INNER JOIN table_objet o ON o.Num_Objet = d.Num_Objet
    WHERE d.Num_Statut = 4
        AND YEAR ( d.Date_Souhaitee_Realisation ) = 2011
        AND o.Acces_GR = 'CAT'
    reperer ceux qui sont hsla donc date_souhaitée < à date_statut (qui est la date de cloture de la demande) en ecrivant HSLA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT o.Libelle_Objet,
        d.Date_Souhaitee_Realisation,
        sd.Date_Statut
    FROM table_demande d
    INNER JOIN table_objet o ON o.Num_Objet = d.Num_Objet
    INNER JOIN table_statut_demande sd ON d.Num_Demande = sd.Num_demande
    WHERE d.Num_Statut = 4
        AND YEAR ( d.Date_Souhaitee_Realisation ) = 2011
        AND o.Acces_GR = 'CAT'
        AND d.Date_Souhaitee_Realisation < sd.Date_Statut
    => Ne manque t-il pas une condition de jointure sur l'équivalence du statut entre table_demande et table_statut_demande pour éviter de ramener tous les statuts de la demande ?
    Et au passage, le statut ne devrait-il pas figurer uniquement dans la table_statut_demande ? N'as-tu pas une redondance de données ?

    en ecrivant HSLA, ou SLA quand la condition est >= dans une colonne qu'on appelerait "Delais".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT o.Libelle_Objet,
        d.Date_Souhaitee_Realisation,
        sd.Date_Statut,
        CASE
            WHEN d.Date_Souhaitee_Realisation < sd.Date_Statut THEN 'HSLA'
            ELSE 'SLA'
        END AS Delais
    FROM table_demande d
    INNER JOIN table_objet o ON o.Num_Objet = d.Num_Objet
    INNER JOIN table_statut_demande sd ON d.Num_Demande = sd.Num_demande
    WHERE d.Num_Statut = 4
        AND YEAR ( d.Date_Souhaitee_Realisation ) = 2011
        AND o.Acces_GR = 'CAT'
    En meme temps, j'aimerais compter le nombre de SLA et de HSLA par regroupement d'Objet et en sortir le % par rapport au total des objets.
    Si tu veux la liste et le comptage, il faut deux requêtes.

    Le nombre de SLA et de HSLA par objet est un nombre de demandes, pas d'objets. Est-il vraiment cohérent de vouloir calculer le pourcentage d'un nombre de demandes par rapport à un nombre total d'objets ?

    Voici la requête qui calcule le nombre de HSLA et de SLA par objet :
    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 o.Libelle_Objet,
        SUM(
            CASE
                WHEN d.Date_Souhaitee_Realisation < sd.Date_Statut THEN 1
                ELSE 0
            END
        ) AS nb_HSLA,
        SUM(
            CASE
                WHEN d.Date_Souhaitee_Realisation <= sd.Date_Statut THEN 1
                ELSE 0
            END
        ) AS nb_SLA
    FROM table_demande d
    INNER JOIN table_objet o ON o.Num_Objet = d.Num_Objet
    INNER JOIN table_statut_demande sd ON d.Num_Demande = sd.Num_demande
    WHERE d.Num_Statut = 4
        AND YEAR ( d.Date_Souhaitee_Realisation ) = 2011
        AND o.Acces_GR = 'CAT'
    GROUP BY o.Libelle_Objet
    Inspire t-en pour avoir ce qui te manque ou précise davantage ton besoin en répondant à mes interrogations.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut ça avance, super!
    j'ai encore des doublons, le comptage des demandes est erroné, j'ai affiché les num_demande pour verifier et voici le resultat:

    Num_demande Libelle_Famille Libelle_Objet nb_HSLA nb_SLA
    60662 Téléphone Fixe Création Télérelève ACM avec MESTA 1 2
    60739 Téléphone Fixe Création Téléconduite avec MESTA 1 2
    60748 Téléphone Fixe Création Télérelève ACM avec MESTA 1 2
    61112 Téléphone Fixe Création Téléconduite avec MESTA 0 3

    il arrive à compter 1 sla + 2 hsla sur la premiere demande alors que je ne devrais avoir que 1 sla ou hsla

    la requete que j'ai modifiée pour cette verif:

    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
    SELECT d.Num_demande, f.Libelle_Famille, o.Libelle_Objet, SUM( 
    CASE WHEN d.Date_Souhaitee_Realisation < sd.Date_Statut
    THEN 1 
    ELSE 0 
    END ) AS nb_HSLA, SUM( 
    CASE WHEN d.Date_Souhaitee_Realisation >= sd.Date_Statut
    THEN 1 
    ELSE 0 
    END ) AS nb_SLA
    FROM table_demande d
    INNER JOIN table_objet o ON o.Num_Objet = d.Num_Objet
    INNER JOIN table_famille f ON d.Num_famille = f.Num_famille
    INNER JOIN table_statut_demande sd ON d.Num_Demande = sd.Num_demande
    WHERE d.Num_Statut =4
    AND YEAR( d.Date_Souhaitee_Realisation ) =2011
    AND o.Acces_GR = 'CAT'
    GROUP BY d.Num_demande, f.Libelle_famille, o.Libelle_Objet
    ********************************************************
    La table Statut demande est comme ça:

    Num_Statut_Demande Num_Demande Num_Statut Date_Statut
    89111 37900 9 2009-06-25

    *********************************************************
    La table_demande est comme ceci:

    Num_Demande Numero_Demande Num_Statut Num_Objet Num_Famille
    41397 41397 9 103 14
    Num_Type Date_Souhaitee_Realisation
    63 2009-09-15
    *******************************************************
    une fois ce probleme corrigé, la requete sera super pour moi , je trouve passionant d'arriver à sortir des resultats sur des Bd, mais j'ai besoin d'une vraie formation!
    Merci encore une fois pour votre aide!

  6. #6
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut c'est OK
    j'ai retravaillé la requete, enfin, j'obtiens ce que je veux, j'ai du afficher les Num_demande et enlever les SUM des SLA ET HSLA, du coup j'en ai profité pour récupérer les Mois des demandes, avec cet export sur excel, je calcule mes totaux et % avec un graphique dynamique. Super.
    Merci pour votre aide précieuse!
    cordialement

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

Discussions similaires

  1. Requète MySQL >> Postgresql
    Par genova dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2005, 10h05
  2. Requête MYSQL LIKE particulière
    Par TheDarkLewis dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/12/2004, 16h50
  3. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 17h11
  4. surcharge de requête MySQL
    Par simoryl dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2004, 11h43
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 11h39

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