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

 MySQL Discussion :

Extraction d'une valeur triée sous deux formes différentes [MySQL-5.1]


Sujet :

MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Extraction d'une valeur triée sous deux formes différentes
    Bonjour à tous.
    Indulgence pour un débutant...
    J'expose mon souci:
    Dans une table contenant h (heure), rpedf (kw), datetime (format DATETIME), j'aspire à extraire rpedf suivant un NO between h(x) et h(y) (=>théoriquement sur 8h) afin d'afficher le résultat en [rpedfhc] sur une plage de 48 heures avec CURRENT_TIMESTAMP, trié par datetime ASC,
    et
    extraire rpedf suivant un between h(x) et h(y) (=>théoriquement sur 16h) afin d'afficher le résultat en [rpedfhp] sur une plage de 48 heures avec CURRENT_TIMESTAMP trié par datetime ASC,
    le tout sur une seule ligne afin d'établir un graphique avec mes deux courbes rpedfhp, rpedfhc pour Google Chart.
    (Il serait intéressant de pouvoir traiter ces deux données séparément afin de les différencier proprement dans le chart, vu que chaque colonne se voit appliquée un tarif différent...)

    Pour le moment, en bricolant du "pas très propre" avec
    Code php : 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
     
    $numsql = "SELECT h FROM `enerduino` WHERE 'CURRENT_TIMESTAMP(), INTERVAL 48 HOUR' > datetime ORDER BY id ASC";
    $hcsqlbw = "SELECT rpedf FROM `enerduino` WHERE h NOT BETWEEN '05' AND '20'";
    $hpsqlbw = "SELECT rpedf FROM `enerduino` WHERE h BETWEEN '05' AND '20'";
     
    $result = @mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    $resulthc = @mysql_query($hcsqlbw) or die('Erreur SQL !<br>'.$hcsqlbw.'<br>'.mysql_error());
    $resulthp = @mysql_query($hpsqlbw) or die('Erreur SQL !<br>'.$hpsqlbw.'<br>'.mysql_error());
     
     
    $i=0;
    $numsql=mysql_numrows($result);
     
    while($datas = @mysql_fetch_assoc($result)){
      echo "\n['".$datas['h'].":".$datas['min']."', ".$datas['rppv'].", ".$datas['rpedf']."]";
    //<= ne tenez pas compte de rppv, h et min qui s'affichent correctement et qui ne me posent aucun problème, mais je n'affiche pour le moment qu'une seule courbe [rpedf] alors que j'aimerai avoir mes deux courbes [rpedfhc] et [rpedfhp]
      if ($i < ($num - 1))
      {
        echo ",\n";
      } else {
        echo "\n";
      }
      $i++;
    }
    J'ai tenté moult essais avec des AVG / GROUP BY ou des sous requêtes de ligne mais les résultats ne sont pas au rendez-vous.
    Même tenté avec
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(($datas = @mysql_fetch_assoc($result)) && ($datas1 = @mysql_fetch_assoc($resulthc)) && ($datas2 = @mysql_fetch_assoc($resulthp))) {
     
    echo "\n['".$datas['h'].":".$datas['min']."', ".$datas['rppv'].", ".$datas1['rpedf']."]".", ".$datas2['rpedf']."]";
    mais encore une fois échec avec un affichage sur une plage de 48h sans le reste jusqu'à NOW donc ne respectant pas le critère "'CURRENT_TIMESTAMP(), INTERVAL 48 HOUR' > datetime".

    Si un furieux du sql aurait une pensée intéressante qui lui passe par la tête, je suis volontiers preneur...
    Pour info, serveur "perso" OVH.
    N'hésitez pas à me dire s'il vous manque une info dans ce morceau de source.
    Merci par avance. Cdt.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Pas certain d'avoir bien compris votre problème(voulez vous faire une somme par jour, ou juste séparer les heures pleines des heures creuses ?).
    Un jeu d'essai plus résultat attendu aiderait à mieux comprendre...
    Mais voici une piste a explorer et à adapter à votre besoin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT 
        DATETIME,
        CASE WHEN h BETWEEN 05 AND 20 THEN rpedf ELSE 0 END AS HeurePleine,
        CASE WHEN h BETWEEN 05 AND 20 THEN O ELSE rpedf END AS HeureCreuse
    FROM ...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    En fait, non, pas de SUM dans la requête.
    Vous avez une valeur dans la table pour conso totale, avec un champs datetime, un champs heure.
    L'idée de base est d'afficher une ligne par valeur trouvée en triant 1) par plage horaire de 21 à 02, 2) par plage horaire de 02 à 21, le tout dans un intervalle de 48h donc de -48 à now. Chaque valeur de chaque plage horaire rentre dans la colonne HP ou HC.
    L'affichage final doit être en gros pour une ligne de résultat [[datetime], [rppv], [rpedfhc], [rpedfhp]] où datetime= colonne DATETIME traité pour avoir date/h/m séparés mais osef, rppv=osef, rpedfhc=valeur colonne rpedf table suivant plage horaire 1 et rpedfhp=valeur colonne rpedf table suivant plage horaire 2.

    Si dans rpedf deux valeurs furent insérées à 17h35 et 20h06, deux autres à 22h33 et 1h45, les deux premières doivent ressortir dans la plage HP et s'afficher dans la colonne rpedfhp du chart, les deux autres doivent ressortir dans la plage HC et s'afficher dans la colonne rpedfhc du chart, tant que celles ci, les unes ou les autres restent dans la plage d'intervalle d'insert de 48h en arrière à now, en imposant l'affichage des courbes de -48h à now (merci google chart d'être trop précis dans la forme et trop flou dans le texte).
    Le traitement sur le chart, pas de problème je gère...

    C'est le request sur la table qui me titille.

    Bon, pour le moment, c'est pas du pressé ou de l'extrême importance d'état, j'affiche déjà ma courbe de prod et de conso mais vrai que j'aimerai afficher les deux courbes de conso HC/HP distinctes.

    Merci, en attendant.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    D'ajouter:
    Merci pour cet exemple, je n'y avais pas pensé sous cette forme.
    Je teste un coup cet aprèsmidi en appliquant la base de votre formulation...

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Pas certain d'avoir bien compris votre problème
    Citation Envoyé par asf21 Voir le message
    En fait, non, pas de SUM dans la requête.
    L'affichage final doit être en gros pour une ligne de résultat [[datetime], [rppv], [rpedfhc], [rpedfhp]] où datetime= colonne DATETIME traité pour avoir date/h/m séparés mais osef, rppv=osef, rpedfhc=valeur colonne rpedf table suivant plage horaire 1 et rpedfhp=valeur colonne rpedf table suivant plage horaire 2.
    En effet... maintenant je suis bien certain de n'avoir rien compris !

    Donc :
    Citation Envoyé par aieeeuuuuu Voir le message
    Un jeu d'essai plus résultat attendu aiderait à mieux comprendre...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je vous donne vite fait l'url temporaire du shtreumel afin de voir ce que ça donne avec seulement une courbe rppv et une rpedf sans traitement hp/hc dans le chart:
    enerduino
    Mais vous n'étiez pas loin, hormis le sum...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bon, j'ai adapté votre formulation à mon cas mais, même en relisant la doc mysql sur le CASE en long large et travers, marche pas (je dois surement faire une erreur sur la requête sans la voir...).
    Me retourne des lignes vides pour rpedf_hp et rpedf_hc avec:
    REQUETE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $test = "SELECT datetime, h, rpedf
     CASE rpedf
      WHEN h BETWEEN 05 AND 20 THEN rpedf ELSE 0 END AS rpedf_hp,
      WHEN h BETWEEN 05 AND 20 THEN 0 ELSE rpedf END AS rpedf_hc
    FROM `enerduino`
    WHERE 'CURRENT_TIMESTAMP(), INTERVAL 48 HOUR' > datetime
    ORDER BY datetime ASC";
    PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(($datas = @mysql_fetch_assoc($result)) && ($datas2 = @mysql_fetch_assoc($test))){
     
    echo "\n['".$datas['h'].":".$datas['min']."', ".$datas['rppv'].", ".$datas2['rpedf_hp'].", ".$datas2['rpedf_hc']."]";
     
    }
    Si je sort $datas2 de la boucle while et que je le met juste avant l'echo, j'ai bien ma liste ascendante de h,min,rppv avec les bonnes valeurs mais les cases rpedf_hp et rpedf_hc restent vides (normal! mais même pas un retour d'une seule ligne de ces valeurs).

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,

    La syntaxe de CASE exige END final

    CASE WHEN THEN ELSE WHEN THEN ELSE END

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    En effet Maljuna Kris et merci.
    Je ne l'avais pas vu venir celle là...
    Cependant, ça ne résout toujours pas mes cases vides...

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Euh, sans mettre en doute vos compétences loin des miennes, êtes vous sûr que ma requête est erronée au niveau du end de case?
    Me semble que chaque case est bel et bien fermé, mis a part l'assignation de la variable rpedf de chaque case, après le end...
    En ce cas, comment assigner la résultante de chaque case?
    Si, dans x je cherche x[] suivant telle condition puis retourne x' et je cherche x[] suivant telle autre condition puis retourne x'', comment donc écrire correctement cette fichue requête?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Alors comme je suis une vrai tête de mule et que tant que pas, cherche...
    1ère erreur: Notre ami aieeeuuuuu m'avait mis un exemple bien formé et j'ai oublié un case avant le deuxième when...
    Premier coup de fouet.
    2ème erreur: Ne jamais oublier le mysql_query pour valider la requete, sinon ça marchera jamais pour l'éternité...
    Deuxième coup de fouet (Aï! safémal!)

    Maintenant, je met un gentil petit coup de lanière de fouet à aieeeuuuuu: ne pas oublier les virgules à certains endroits d'une requete aussi complexe, sinon il y aura toujours des erreurs que php ne signalera jamais.
    Et aussi un gentil petit coup de lanière à notre ami Maljuna Kris: les END étaient bien présents et acceptent un AS après, à condition de terminer par une virgule si et seulement si un autre CASE est appelé.
    Si bien qu'avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $test = "
    SELECT datetime, h, rpedf,
    	CASE WHEN h BETWEEN 05 AND 20 THEN rpedf ELSE 0 END AS rpedf_hp,
    	CASE WHEN h BETWEEN 05 AND 20 THEN 0 ELSE rpedf END AS rpedf_hc
    FROM `enerduino` WHERE 'CURRENT_TIMESTAMP(), INTERVAL 48 HOUR' > datetime ORDER BY datetime ASC";
     
    $restest = @mysql_query($test) or die('Erreur SQL !<br>'.$test.'<br>'.mysql_error());
    et le PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(($datas = @mysql_fetch_assoc($result)) && ($datas2 = @mysql_fetch_assoc($restest))){
     
    echo "\n['".$datas['h'].":".$datas['min']."', ".$datas['rppv'].", ".$datas2['rpedf_hp'].", ".$datas2['rpedf_hc']."]";
    on arrive au résultat suivant:
    ['Temps', 'Production', 'Consommation HC', 'Consomation HP'],
    ['02:50', 3.47, 0, 2207.61010742188],

    ['03:50', 2.37, 0, 402.899993896484],

    ['04:50', 2.07, 0, 859.169982910156],

    ['05:50', 2.26, 1263.78002929688, 0],

    ['06:50', 1.83, 1344.18994140625, 0],

    ['07:50', 281.89, 787.260009765625, 0],

    ['08:50', 967.21, 476.170013427734, 0],

    ECAETERA
    Qui nous dessine de jolies courbes avec Google Chart...
    Un grand merci tout de même à aieeeuuuuu et Maljuna Kris qui m'ont mis sur la bonne voie en m'obligeant à chercher grace à leurs interventions constructives.
    Si ça peut servir...
    Pour info pour ceux que ça intéresse, Arduino perso avec Atmega368, shield W5100, shield double Isense + téléinfo ErDF + téléinfo SMA SunnyBoy perso, source complet d'aquisition/traitement/affichage web entièrement perso, parse des données depuis un script php perso sur serveur distant et enregistrement des données sur bdd mysql.
    Prévision d'hébergement php/mysql local sur Raspberry ou PC104 et gestion de relais installé dans la colonne énergie ainsi que passage sur Atmega32 pour plus de IO, ram et mips.
    Je me suis tapé tout ça pour ne pas utiliser Openenergy trop usine à gaz ainsi que des hébergeurs de data style Pachube pour leurs restrictions de source sur serveur et trop usine à gaz.

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par asf21 Voir le message
    Maintenant, je met un gentil petit coup de lanière de fouet à aieeeuuuuu: ne pas oublier les virgules à certains endroits d'une requete aussi complexe, sinon il y aura toujours des erreurs que php ne signalera jamais.
    Où ai-je oublié une virgule ?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Opppsss! Décidément!
    Je vous laisse me rendre ce coup de lanière de fouet!

    Au temps pour moi...
    On fait comme si rien n'était?

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

Discussions similaires

  1. [CR 10] Problème de récupération d'une valeur de sous-état
    Par lolo6413 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 12/09/2010, 11h17
  2. Séparer une valeur monétaire en deux
    Par medkyl dans le forum Débuter
    Réponses: 7
    Dernier message: 30/11/2009, 14h49
  3. Extraction d'une table Access sous Excel
    Par Chikatilo dans le forum VBA Access
    Réponses: 11
    Dernier message: 22/07/2008, 15h18
  4. [CR 8.5] Uilisation d'une valeur de sous-rapport
    Par GeoPierre dans le forum Formules
    Réponses: 2
    Dernier message: 28/05/2008, 14h19
  5. Réponses: 1
    Dernier message: 18/12/2006, 18h13

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