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 :

Tableau croisé dynamique


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut Tableau croisé dynamique
    Bonjour,
    Je cherche à automatiser en php la production d’un «*tableau croisé*» à partir d’une requête SQL.
    Ma requête contient les champs « ville*», «*mois*» et «*température*».
    Je voudrais en faire un tableau des températures avec les villes en ligne et les mois en colonne.
    Pour cela, je construis une requête avec autant de jointures que de colonnes.
    Mais je pense qu’il y a plus malin à faire.
    Merci pour toute aide
    Philippe

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Deux options :
    soit construire une requête sur la base de façon à récupérer les données de façon à avoir les 12 températures dans une même ligne de résultat (je suppose qu'on parle d'une année entière)
    soit faire une requête qui remonte tout avec un tri par ville et par mois et faire une boucle conditionnelle pour traiter les données (du type "si c'est la même ville que le résultat précédent, continuer sur la même ligne de tableau)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    Merci !
    Quelle méthode serait selon toi la plus rapide à l’execution ?
    Pour la seconde méthode, comment gères tu le cas où l’on n’ait pas toutes les valeurs : par exemple, le cas où, dans la requête triée par ville puis par mois, le premier enregistrement soit le mois de mars de la ville 1, puis le second enregistrement soit le mois de février de la ville 2 etc.
    Il faut une condition supplémentaire pour aller jusqu’à la bonne colonne. Comment le gérerais tu ?
    Bonne soirée

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A moins que ta table en base ne contienne des millions de lignes, je ne pense pas qu'il y ait réellement une question de performance (autrement dit, je ne sais pas mais je ne m'en préoccupe pas trop )

    Pour la version par PHP, tu peux soit mapper la totalité des données dans un tableau indexé par ville et par mois et ensuite boucler dessus, ou alors tu jongles avec des variables "données en cours" en parcourant.
    Pour les mois manquants, tu peux initialiser un tableau avec des données vides pour les mois que tu ais censé avoir, et les remplacer au fur et à mesure avec les vraies données.

    Exemple de code (non testé) :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
    $res = $pdo->query('select ville, mois, temperature from la_table order by ville, mois');
    ?>
    <table>
    	<thead>
    		<tr>
    			<th>Ville</th>
    <?php
    for ($i = 1;$i<=12;$i++) {
    	echo '<th>'.$i.'</th>';
    }
    ?>
    		</tr>
    	</thead>
    	<tbody>
    <?php
    $first = true;
    $current = '';
    $line = array_fill(1, 12, '');
    while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
    	if ($first) {
    		$current = $row['ville'];
    		$first = false;
    	}
    	if ($current != $row['ville']){
    		// la ville du résultat est différente de la ville en cours, on écrit la ligne en cours
    		echo '<tr>';
    		echo '<th>'.$current.'</th>';
    		foreach($line as $col) {
    			echo '<td>'.$col.'</td>';
    		}
    		echo '<tr>';
    		// on réinit le tableau et la ville
    		$current = $row['ville'];
    		$line = array_fill(1, 12, '');
    	}
     
    	// on stocke la donnée du mois en cours
    	$line[$row['mois']] = $row['temperature'];
    }
    // on affiche la dernière ligne du tableau
    echo '<tr>';
    echo '<th>'.$current.'</th>';
    foreach($line as $col) {
    	echo '<td>'.$col.'</td>';
    }
    echo '<tr>';
    ?>
    	</tbody>
    </table>
    Ce code suppose que tu affiches les données d'une année donnée de janvier à décembre et que tu récupères juste le numéro du mois.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Pgs
    Pgs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 482
    Points : 100
    Points
    100
    Par défaut
    Génial !

    Merci beaucoup !!

    J'en profite pour deux questions bonus :

    a) Je ne suis pas très habitué aux tableaux mais que crois qu'il est possible de nommer les colonnes. Si mon second index n'était pas numérique (par exemple si au lieu d'avoir les mois, j'avais (tempmax, tempmini, tempmoyenne), comment pointerais-tu sur le bonne colonne du tableau ?

    b) Ce serait quoi "mapper la totalité des données dans un tableau indexé par ville et par mois et ensuite boucler dessus" ?

    Merci encore !

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Donc maintenant, tu veux une ligne par ville et par mois. Ca change tout, c'est une requête d'agrégation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select ville, mois,max(temperature) as temp_max,min(temperature) as temp_min,avg(temperaure) as temp_moyenne 
    from la_table 
    group by ville, mois
    order by ville, mois
    regarde déjà si ceci fonctionne dans ton Phpmyadmin
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

Discussions similaires

  1. filtrer tableau croisé dynamique sous excel
    Par kernel57 dans le forum Excel
    Réponses: 7
    Dernier message: 17/11/2006, 14h18
  2. Tableau croisé dynamique
    Par papy_tergnier dans le forum Access
    Réponses: 5
    Dernier message: 26/12/2005, 18h05
  3. Tableau croisé dynamiqué élaboré sous Access
    Par Mahefasoa dans le forum Access
    Réponses: 1
    Dernier message: 20/11/2005, 08h04
  4. tableau Croisé Dynamique
    Par Bjuice2 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/11/2005, 10h36
  5. tableau croisé dynamique sous delphi, comment ?
    Par Brice Yao dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/07/2005, 09h33

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