Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 06/02/2011, 10h50   #1
Membre habitué
 
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 127
Points : 127
Par défaut Tutoriel sur les GROUP BY : exemple incompris

Bonjour,

Je suis en train de lire un tutoriel de dvp sur les GROUP BY, et l'exemple 5 me laisse perplexe.
Je suppose qu'il s'agit de quelque chose de tout bête, mais... qui m'échappe.

En effet, d'après l'exemple 3, la chambre 1 a eu 558 nuités durant l'année 1999 ; et d'après l'exemple 4, sa capacité totale est de 1095 nuités. L'exemple 5 indique alors que son taux d'occupation sur cette période est de 65.29%.
Toutefois, je me serai attendu à un taux d'occupation de 100*558/1095 = 50.96%....

Dans la mesure où l'exécution de ces trois requêtes sur les données d'exemple, me retourne bien les résultats du tutoriel, j'en déduis qu'il y a quelque chose que j'interprète de travers, mais je n'arrive pas à mettre le doigt dessus.

Pourriez vous m'indiquer ce qui m'échappe ?

Je vous remercie par avance.
_ash_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 13h57   #2
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 878
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 878
Points : 7 655
Points : 7 655
Le taux d'occupation est bien de 50.96% et la requete donnée en exemple 5 est apparemment fausse.

Le soucis vient, je pense, de la façon dont sont regroupées les 2 requêtes. En effet, il s'agit de jointures sur des requêtes avec agrégations donc une jointure sur des données virtuelles ce qui peut pervertir le résultat.

Dans ce genre de situation, il faut bien faire attention à faire la jointure sur les données réelles et faire l'agrégation après. Il faut aussi faire attention à ce que les valeurs nulles soient prises en compte (en les remplaçant par 0 par exemple) si leurs présence est significatives, sinon les lignes correspondantes seront ignorées par l'agrégation.

Un exemple de requete qui marche :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT (100 * SUM(CAST(CHB_PLN_CLI_NB_PERS AS FLOAT)) / 
       SUM(CAST(CHB_COUCHAGE AS FLOAT))) 
             AS TAUX_OCCUPATION_POURCENT,
             CHB_ID 
FROM (
  SELECT COALESCE(P.CHB_PLN_CLI_NB_PERS,0) AS CHB_PLN_CLI_NB_PERS,
           COALESCE(C.CHB_COUCHAGE,0) AS CHB_COUCHAGE,
                 C.CHB_ID 
  FROM T_CHAMBRE C
  CROSS JOIN T_PLANNING PG
  LEFT OUTER JOIN TJ_CHB_PLN_CLI P ON C.CHB_ID = P.CHB_ID AND P.PLN_JOUR=PG.PLN_JOUR
  WHERE PG.PLN_JOUR BETWEEN '1999-01-01' AND '1999-12-31'
) T
GROUP BY CHB_ID
ORDER BY CHB_ID
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 14h03   #3
Membre habitué
 
Inscription : juillet 2008
Messages : 120
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 120
Points : 127
Points : 127
Merci pour ces éclaircissements !
_ash_ 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 08h40.


 
 
 
 
Partenaires

Hébergement Web