Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/03/2011, 13h52   #1
Invité de passage
 
Didier
Inscription : mars 2011
Messages : 14
Détails du profil
Informations personnelles :
Nom : Didier

Informations forums :
Inscription : mars 2011
Messages : 14
Points : 0
Points : 0
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 :
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` 
)
didier12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 16h34   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 993
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 993
Points : 18 246
Points : 18 246
Envoyer un message via MSN à CinePhil
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.

Citation:
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 09h38   #3
Invité de passage
 
Didier
Inscription : mars 2011
Messages : 14
Détails du profil
Informations personnelles :
Nom : Didier

Informations forums :
Inscription : mars 2011
Messages : 14
Points : 0
Points : 0
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!
didier12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h04   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 993
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 993
Points : 18 246
Points : 18 246
Envoyer un message via MSN à CinePhil
Citation:
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...
Citation:
lister tous les objets qui sont de statut 4 et de 2011
Code :
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
Citation:
on peut supprimer la colonne CAT mais pas le critere
Code :
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'
Citation:
reperer ceux qui sont hsla donc date_souhaitée < à date_statut (qui est la date de cloture de la demande) en ecrivant HSLA
Code :
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 ?

Citation:
en ecrivant HSLA, ou SLA quand la condition est >= dans une colonne qu'on appelerait "Delais".
Code :
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'
Citation:
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 19h08   #5
Invité de passage
 
Didier
Inscription : mars 2011
Messages : 14
Détails du profil
Informations personnelles :
Nom : Didier

Informations forums :
Inscription : mars 2011
Messages : 14
Points : 0
Points : 0
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 :
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!
didier12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 08h53   #6
Invité de passage
 
Didier
Inscription : mars 2011
Messages : 14
Détails du profil
Informations personnelles :
Nom : Didier

Informations forums :
Inscription : mars 2011
Messages : 14
Points : 0
Points : 0
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
didier12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h25.


 
 
 
 
Partenaires

Hébergement Web