2 problèmes d'SQL... Problématique !

Mammouth du PHP | 568 Messages

02 nov. 2005, 12:24

Salut les jeunes !

Voilà, jai voulu se matin faire 2 requêtes avec pour but de me faciliter la tache en évitant des taitements derrière...

En gros, j'ai une table qui va ressembler à ça :

Code : Tout sélectionner

TABLE_1 : id ----- labo ---- dept ----------- valeur 1 ------- 01 ------ 01 --------------- 3 2 ------- 01 ------ 02 --------------- 2 3 ------- 01 ------ 03 --------------- 0 4 ------- 02 ------ 01 --------------- 4 5 ------- 02 ------ 02 --------------- 0 6 ------- 02 ------ 03 --------------- 0 . . .
1
Ma 1ère requête doit me compter le nombre d'enregistrement, par département, dont valeur>0. J'ai donc ma requête :

Code : Tout sélectionner

SELECT dept, COUNT(id) FROM TABLE_1 WHERE valeur>0 GROUP BY dept
J'espère obtenir comme résultat :

Code : Tout sélectionner

dept ------ COUNT(id) -01 ------------ 2 -02 ------------ 1 -03 ------------ 0
Mais au lieu de cela, j'obtiens :

Code : Tout sélectionner

dept ------ COUNT(id) -01 ------------ 2 -02 ------------ 1
Le département avec aucune ligne supèrieur à 0 n'est pas affiché.
Comment s'en sortir ?

2
Ma 2nde réquète, toujours dans un soucis de non traitement dans le code derrière, devait m'afficher, département pas département, le labo avec sa valeur triée par valeur décroissante, afin de déterminer un ordre dans les labos...

Du genre :

Code : Tout sélectionner

SELECT labo, valeur FROM TABLE_1 WHERE dept="01" ORDER BY valeur DESC
Mais j'aurais voulu rajouter une 3ème colonne de résultat, auto-incrémenté afin d'obtenir directement son rang (donc, ne pas avoir à compter le nombre de lignes avant d'arriver au labo souhaité)
Un résultat dans ce genre, pour le dept 01 :

Code : Tout sélectionner

labo ----------- valeur ----------- pos 02 --------------- 4 ---------------- 1 01 --------------- 3 ---------------- 2
Un résultat dans ce genre, pour le dept 02 :

Code : Tout sélectionner

labo ----------- valeur ----------- pos 01 --------------- 2 ---------------- 1 02 --------------- 0 ---------------- 2
Etc... Donc pos n'aurais simplement que 1, 2, 3, 4, 5, etc...
Comment s'en sortir ?

Merci à vous si vous avez des idées, je susi preneur :roll:
Heddi s'est remis à développer pour lui même !
Martina Hingis - Étoile du Tennis
Heddi v. 2007

ViPHP
pjl
ViPHP | 2119 Messages

02 nov. 2005, 12:40

pour la 1, c'est logique.
tu lui demande d'afficher ce qui est supérieur à 0 et tu t'étonnes que dans ton résultat, tu ne trouve pas le résultat de l'opération suivante 0+0.
Vire ta condition et tu auras ce que tu veux.

2. ce n'est pas possible mais de toute facon tu l'as avec ton résultat finale.
Tu récupères en PHP un tableau de ressources.
Si tu veux connaitre le 3eme, il te suffit d'afficher la 3eme ligne.

Mammouth du PHP | 568 Messages

02 nov. 2005, 12:53

pour la 1, c'est logique.
tu lui demande d'afficher ce qui est supérieur à 0 et tu t'étonnes que dans ton résultat, tu ne trouve pas le résultat de l'opération suivante 0+0.
Vire ta condition et tu auras ce que tu veux.
Je sais bien que c'est logique, mais j'aurais aimé trouvé une solution qui affiche, quoiqu'il en soit TOUS les départements avec le résultat de COUNT de 0 à x...
2. ce n'est pas possible mais de toute facon tu l'as avec ton résultat finale.
Tu récupères en PHP un tableau de ressources.
Si tu veux connaitre le 3eme, il te suffit d'afficher la 3eme ligne.
Je suis pas en PHP, je fais une infidélité VBiène en ce moment...

Mais le soucis, n'était pas vraiment de connaitre le 3ème, mais la position du labo X... Donc bon, bin je vais naviguer dans les résultat, tant pis :cry:
Heddi s'est remis à développer pour lui même !
Martina Hingis - Étoile du Tennis
Heddi v. 2007

Eléphant du PHP | 219 Messages

02 nov. 2005, 14:20

Pour la première, tu peux t'inspirer de la réponse que j'ai faite à iclo ici

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 nov. 2005, 15:50

Une solution, la jointure à gauche => afficher tout à gauche même si aucune jointure correspondante à droite:
SELECT a.dept, b.compte
FROM 
(
SELECT DISTINCT dept
FROM test.table_1
) AS a

LEFT JOIN 
(
SELECT dept, count( id ) AS compte
FROM test.table_1
WHERE valeur >0
GROUP BY dept
) AS b 

ON a.dept = b.dept
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène