Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 18/02/2011, 13h35   #1
Débutant
 
Inscription : novembre 2004
Messages : 268
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 268
Points : 99
Points : 99
Par défaut optimiser une requête SELECT

Bonjour, je souhaiterais optimiser cette requête qui en fait 5....

Dans table, il y a normalement autant de lignes avec pour application SUM que application VS.
Eventuellement, il y a eu des problèmes avec VS et le but de la requête estr de les détecter.

Exemple

Citation:
tradeid application

A SUM
A VS
B SUM
B VS
C SUM
D SUM
E SUM
E VS
L'idée est de retourner C et D.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT  Count(produitid)
FROM TABLE
AND application = 'SUM'
AND produitidIN 
    (   SELECT produitid
    FROM TABLE 
    AND application = 'SUM'
    AND produitidIN 
        ( SELECT produitid
          FROM infos
          AND isvsvalued='Y' 
          AND application='SUM') 
) 
AND   produitidNOT IN(  
    SELECT produitid
    FROM TABLE 
    AND application = 'VS'
    AND produitidIN 
        ( SELECT produitid
          FROM infos
          AND isvsvalued='Y' 
          AND application='SUM' ) 
)
Sachant que il y a complémentarité entre les lignes ayant pour application = 'VS' et 'SUM'.
Le but étant de trouver les lignes qui manquent à VS.
molesqualeux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 13h51   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
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 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Euh... FROM suivi de AND doit provoquer une erreur de syntaxe ! Il ne manquerait pas des WHERE dans ta requête ?

Du coup, ne comprenant pas trop le sens de la requête, je réponds par rapport au besoin exprimé :
Citation:
Dans table, il y a normalement autant de lignes avec pour application SUM que application VS.
Eventuellement, il y a eu des problèmes avec VS et le but de la requête estr de les détecter.
On compte le nombre de SUM et de VS par tradeid et on ne conserve que les lignes où ces deux sommes sont différentes
Code :
1
2
3
4
5
6
SELECT tradeid, 
    SUM(CASE WHEN application = 'SUM' THEN 1 ELSE 0 END) AS nb_SUM,
    SUM(CASE WHEN application = 'VS' THEN 1 ELSE 0 END) AS nb_VS
FROM la_table
GROUP BY tradeid
HAVING nb_SUM <> nb_VS
__________________
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 18/02/2011, 14h04   #3
Débutant
 
Inscription : novembre 2004
Messages : 268
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 268
Points : 99
Points : 99
Merci , ça marche sans le HAVING, je vois le nombre de fois pour VS et SUMMIT.
Par contre, le HAVING me met une erreur de invalid identifier.

Apparemment, on ne peut pas utiliser l'alias dans le having.
http://download.oracle.com/docs/cd/B...ents_10002.htm

HAVING SUM(CASE WHEN application = 'SUMMIT' THEN 1 ELSE 0 END) <> SUM(CASE WHEN application = 'VS' THEN 1 ELSE 0 END)
molesqualeux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 15h11   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
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 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Alors je poste la première requête que j'avais faite avec une sous-requête au lieu du HAVING :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT tmp.tradeid
FROM
(
    SELECT tradeid, 
        SUM(CASE WHEN application = 'SUM' THEN 1 ELSE 0 END) AS nb_SUM,
        SUM(CASE WHEN application = 'VS' THEN 1 ELSE 0 END) AS nb_VS
    FROM la_table
    GROUP BY tradeid
) tmp
WHERE tmp.nb_SUM <> tmp.nb_VS
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h10.


 
 
 
 
Partenaires

Hébergement Web