Bonjour,
Cette discussion fait suite à une précédente.
Pour rappel, je désire compter des logements par immeuble et par année.
Dans la précédente discussion, Waldar m'a notamment précisé que si MySQL est permissif sur le GROUP BY, pour les autres SGBD, il fallait inclure l'ensemble des colonnes de la clause SELECT dans le GROUP BY.
Maintenant, j'ai dû modifier la requête précédente pour une raison métier. En effet, alors que je comptais mes logements en tenant compte de la date de début et fin des immeubles, j'ai pris comme critère les dates de début et fin des logements, le nombre de ceux-ci dans un immeuble pouvant varier au fil des années.
J'ai donc la requête suivante :
Elle ne fonctionne pas vraiment de la manière attendue. En effet, tant qu'aucun logement n'a de date de fin renseignée, j'ai bien le résultat que je désire :
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 SELECT cal.ANNEE_REF , EXTRACT(YEAR FROM log.DATE_DEBUT) AS ANNEE_DEBUT , EXTRACT(YEAR FROM log.DATE_FIN) AS ANNEE_FIN , imm.NUMERO_DOSSIER , imm.LETTRE_DOSSIER , imm.TYPE_STATUT_IMMEUBLE_ID_FK , COUNT(log.ID) AS NB_LOG FROM (SELECT DISTINCT EXTRACT(YEAR FROM DATE) AS ANNEE_REF FROM ipc) AS cal JOIN immeuble AS imm JOIN logement AS log ON log.IMMEUBLE_ID_FK = imm.ID AND cal.ANNEE_REF >= EXTRACT(YEAR FROM log.DATE_DEBUT) AND (cal.ANNEE_REF <= EXTRACT(YEAR FROM log.DATE_FIN)-1 OR log.DATE_FIN IS NULL) WHERE imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3 GROUP BY cal.ANNEE_REF , EXTRACT(YEAR FROM log.DATE_DEBUT) , EXTRACT(YEAR FROM log.DATE_FIN) , imm.NUMERO_DOSSIER , imm.LETTRE_DOSSIER , imm.TYPE_STATUT_IMMEUBLE_ID_FK ORDER BY cal.ANNEE_REF ASC , imm.NUMERO_DOSSIER ASC , imm.LETTRE_DOSSIER ASC;
1984 1000 26
1985 1000 26
1986 1000 26
1987 1000 26
etc...
Par contre, si je renseigne une date fin d'un logement, j'obtiens ceci :
1984 1000 25
1984 1000 1
1985 1000 25
1985 1000 1
1986 1000 25 <== ici, un logement en moins, ce qui est correct.
1987 1000 25
etc...
Si je supprime les dates de début et fin des logements du GROUP BY, j'ai bien le résultat que je désire obtenir .
Ma question est la suivante. La bonne pratique du SQL autorise-t-elle de sciemment ignorer certaines colonnes de la clause SELECT dans le GROUP BY, dès lors qu'on en connaît l'effet dans le résultat ?
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 cal.ANNEE_REF , EXTRACT(YEAR FROM log.DATE_DEBUT) AS ANNEE_DEBUT , EXTRACT(YEAR FROM log.DATE_FIN) AS ANNEE_FIN , imm.NUMERO_DOSSIER , imm.LETTRE_DOSSIER , imm.TYPE_STATUT_IMMEUBLE_ID_FK , COUNT(log.ID) AS NB_LOG FROM (SELECT DISTINCT EXTRACT(YEAR FROM DATE) AS ANNEE_REF FROM ipc) AS cal JOIN immeuble AS imm JOIN logement AS log ON log.IMMEUBLE_ID_FK = imm.ID AND cal.ANNEE_REF >= EXTRACT(YEAR FROM log.DATE_DEBUT) AND (cal.ANNEE_REF <= EXTRACT(YEAR FROM log.DATE_FIN)-1 OR log.DATE_FIN IS NULL) WHERE imm.TYPE_STATUT_IMMEUBLE_ID_FK >= 3 GROUP BY cal.ANNEE_REF , imm.NUMERO_DOSSIER , imm.LETTRE_DOSSIER , imm.TYPE_STATUT_IMMEUBLE_ID_FK ORDER BY cal.ANNEE_REF ASC , imm.NUMERO_DOSSIER ASC , imm.LETTRE_DOSSIER ASC;
Ou bien faudrait-il écrire cette requête différemment ?
Merci d'avance.
Partager