IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête PostgreSql moyenne [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 31
    Points : 30
    Points
    30
    Par défaut Requête PostgreSql moyenne
    Bonjour à tous,

    J'essaie depuis un moment de résoudre un problème dont je ne vois pas la cause.
    Il me faut obtenir un prix moyen des logements au m² dans la colonne commune de mon tableau. Les lignes de mon tableau correspondent au différents types de biens (maison , T1,T2,...).
    Le principe est donc de recenser les mêmes type de bien d'une même commune, diviser les prix de ces biens par leurs superficies afin d'obtenir le prix au m² par type de bien.

    Voici la requête créée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $req_pa= pg_query($base,"SELECT type_bien, COUNT(id) as nb, sum(superficie) as surf, sum(prix) as prix FROM logpriv_2013
    	WHERE superficie>0 and insee='".$commune."' GROUP BY type_bien order by type_bien");;
    La mise en forme est réalisée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while($rep_i = pg_fetch_assoc($req_pi))
    {
    	$rep_o = pg_fetch_assoc($req_po);
    	$rep_a = pg_fetch_assoc($req_pa);
    	echo "<tr>
    		<td class='defaut' bgcolor='#FBFA50'><h4>Prix : ".$rep_a['type_bien']." (nombre de logements)</h4></td>
    		<td class='defaut'><h3>".number_format($rep_a['prix']/$rep_a['surf'],2,',',' ')." &nbsp;(
    		".number_format($rep_a['nb'],0,',',' ')." )&nbsp;</h3></td>
    		<td class='defaut'><h3>".number_format($rep_o['prix']/$rep_o['surf'],2,',',' ')." &nbsp;(
    		".number_format($rep_o['nb'],0,',',' ')." )&nbsp;</h3></td>
    		<td class='defaut'><h3>".number_format($rep_i['prix']/$rep_i['surf'],2,',',' ')." &nbsp;(
    		".number_format($rep_i['nb'],0,',',' ')." )&nbsp;</h3></td>
    	</tr>";
    }
    Cela fonctionne très bien lorsque qu'il n'y a qu'une seule occurrence en revanche le calcul n'est plus bon lorsque qu'il y en a plus.

    J'ai essayé de passer par la fonction d'agrégation AVG mais en vain.
    J'ai aussi essayé de créer une variable moyenne dans la requête ...

    J'ai tout d'abord pensé à un problème d'arrondi car peu d'erreur sur les calculs mais plus il y a d'occurrences plus il y'a d'erreur...

    Je ne comprends pas très bien malgré de nombreuses recherches !!

    Si vous avez des pistes je serais ravi d'en parler.

    PS : Si je n'ai pas été clair n'hésitez pas à me demander plus d'infos.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi il y a 3 requêtes ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 31
    Points : 30
    Points
    30
    Par défaut
    Car dans les autres colonnes je fais des regroupements à différentes échelles (différents ensembles de communes).

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca serait peut être mieux de faire des sous-requêtes mais c'est une autre question.

    Tu pourrais donner un exemple de jeu de données, le résultat obtenu et le résultat souhaité ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 31
    Points : 30
    Points
    30
    Par défaut
    En fait je reprends le travail de quelqu'un et je ne suis pas un grand spécialiste donc je m'adapte et avance à tatons ... Mais tout conseil m’intéresse !!

    Données :

    prix surface
    1. 439 26
    2. 800 39
    3. 1050 70
    4. 1110 80
    5. 1350 120
    6. 1395 70
    7. 1600 200

    résultat obtenu : 12,80
    résultat voulu : 15,06

    Le nombre de biens pris en compte est bien le bon car le count (id) affiche 7 occurrences.
    En tout cas merci de prendre de ton temps pour ce problème !

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est un problème de maths

    Le bon résultat est bien 12,8 : tu as 7744€ pour 605m2 sur la zone étudiée = 12,8 € / m2

    12,5 c'est la moyenne des prix moyen par type de bien.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 31
    Points : 30
    Points
    30
    Par défaut
    Ok, mais en effet il me faut bien la moyenne des prix moyens au m².
    J'ai du mal exprimer mon problème.

    Au final c'est ma requête qui est mal construite et qui n'effectue pas le bon calcul !!

    Du coup il faut que je calcule d'abord le prix de chaque bien puis dans un second temps faire la moyenne des prix moyens par type de biens ??

    Merci de m'avoir éclairé sur cette mauvaise approche du problème

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Peut être comme ça alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT type_bien, AVG(superficie / prix) FROM logpriv_2013
    	WHERE superficie>0 and insee='".$commune."' GROUP BY type_bien order by type_bien
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2012
    Messages : 31
    Points : 30
    Points
    30
    Par défaut
    Merci sabotage,

    En fait j'ai calculé au préalable le prix au m² de chaque bien dans ma table PostGres.
    Ensuite j'ai créé une variable moyenne qui somme les prix au m² des différents types de bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $req_a= pg_query($base,"SELECT type_bien, COUNT(id) as nb, sum(prix_m) as moy FROM logpriv_13
    		WHERE insee='".$commune."' GROUP BY type_bien order by type_bien");
    Puis j'ai divisé cette variable par le nombre de bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <td class='defaut'><h3>".number_format($rep_a['moy']/$rep_a['nb'],2,',',' ')." &nbsp;(
    				".number_format($rep_a['nb'],0,',',' ')." )&nbsp;</h3></td>
    Merci encore Sabotage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PostgreSQL] Internal Error 500 suite à requête postgresql
    Par vaderetro33 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 12/10/2010, 10h36
  2. Requête croisée (moyennes dans un tableau)
    Par ganguill dans le forum SQL
    Réponses: 9
    Dernier message: 09/06/2010, 09h45
  3. Réponses: 2
    Dernier message: 30/05/2008, 22h37
  4. Date+delai dans une requête PostGresql
    Par bobic dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/03/2007, 12h11
  5. Requête sql, moyenne pondérée
    Par ouiffi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/07/2006, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo