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

Delphi Discussion :

Tableaux croisés MySQL Delphi


Sujet :

Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut Tableaux croisés MySQL Delphi
    Bonjour,
    je souhaite via Delphi récupérer des données de manière croisée.
    Je sèche sur une solution efficace, ma table contient 50000 mesures :-(
    Attention, le nombre de probes n'est pas fixe!!!

    la table d'entrée est de ce type:
    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
    +---------------------+-----------------+-------------------+
    |      DateTime       |     Probe       |   Temperature     +
    +---------------------|-----------------+-------------------+
    |     24/01/2018      |       1         |      21.5         +
    +---------------------|-----------------+-------------------+
    |     24/01/2018      |       2         |      22.5         +
    +---------------------|-----------------+-------------------+
    |     24/01/2018      |       3         |      23.5         +
    +---------------------|-----------------+-------------------+
    |     25/01/2018      |       1         |      18.5         +
    +---------------------|-----------------+-------------------+
    |     25/01/2018      |       2         |      19.5         +
    +---------------------|-----------------+-------------------+
    |     25/01/2018      |       3         |      20.5         +
    +---------------------|-----------------+-------------------+
    |     26/01/2018      |       1         |      15.5         +
    +---------------------|-----------------+-------------------+
    |     26/01/2018      |       3         |      15.5         +
    +---------------------|-----------------+-------------------+
    |     27/01/2018      |       1         |      17.5         +
    +---------------------|-----------------+-------------------+
    |     27/01/2018      |       2         |      18.5         +
    +---------------------|-----------------+-------------------+

    la table en sortie devrait être de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +---------------------+-----------------+-------------------+-------------------+
    |      DateTime       |     Probe 1     |      Probe 2      +      Probe 3      +
    +---------------------+-----------------+-------------------+-------------------+
    |     24/01/2018      |      21.5       |      22.5         |      23.5         +
    +---------------------+-----------------+-------------------+-------------------+
    |     25/01/2018      |      18.5       |      19.5         |      20.5         +
    +---------------------+-----------------+-------------------+-------------------+
    |     26/01/2018      |      15.5       |                   |      15.5         +
    +---------------------+-----------------+-------------------+-------------------+
    |     27/01/2018      |      17.5       |      18.5         |                   +
    +---------------------+-----------------+-------------------+-------------------+


    Merci pour vos idées
    PhilLU

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Il vaudrait mieux poser la question dans le forum SQL et fouiller d'abord dans celui-ci car la question est assez souvent posée. Voir des mots clés comme PIVOT mais je ne crois pas que MySQL connaisse et comme le nombrer d'échantillon n'est pas fixe
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Merci SergioMaster,
    C'est fait...


    Citation Envoyé par SergioMaster Voir le message
    Bonjour,
    Il vaudrait mieux poser la question dans le forum SQL et fouiller d'abord dans celui-ci car la question est assez souvent posée. Voir des mots clés comme PIVOT mais je ne crois pas que MySQL connaisse et comme le nombrer d'échantillon n'est pas fixe

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Citation Envoyé par PhilLU Voir le message
    Merci SergioMaster,
    C'est fait...
    Mais dommage "ShaiLeTroll, vous n'avez pas la permission d'accéder à cette page"


    Je l'ai fait en MySQL 4

    Tu commences par faire une requête qui récupère le nombre maximum de Probe si celui ci n'est pas toujours de 1 à 3
    Tu génères ensuite le SQL qui va convertir tes données en ligne sous forme de plusieurs colonnes


    Code sql : 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
     
     
    CREATE TABLE TEMP.A_PROBE
    (
      DATETIME     DATE,
      PROBE        NUMBER,
      TEMPERATURE  NUMBER
    );
     
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '24/01/2018'      ,       1         ,      21.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '24/01/2018'      ,       2         ,      22.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '24/01/2018'      ,       3         ,      23.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '25/01/2018'      ,       1         ,      18.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '25/01/2018'      ,       2         ,      19.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '25/01/2018'     ,       3         ,      20.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '26/01/2018'      ,       1         ,      15.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '26/01/2018'      ,       3         ,      15.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '27/01/2018'     ,       1         ,     17.5          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '27/01/2018'      ,       2         ,      18.5   );
     
    SELECT MAX(PROBE) FROM TEMP.A_PROBE

    Tu es d'accord que générer cette requête en DELPHI avec le MAX n'a rien de difficile avec une petite boucle
    Code sql : 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
     
        SELECT DATETIME, MAX(PROBE_1) AS PROBE_1, MAX(PROBE_2) AS PROBE_2, MAX(PROBE_3) AS PROBE_3
        FROM
          (
            SELECT DATETIME, TEMPERATURE AS PROBE_1, NULL  AS PROBE_2, NULL  AS PROBE_3
            FROM TEMP.A_PROBE
            WHERE PROBE = 1 
            UNION
            SELECT DATETIME, NULL  AS PROBE_1, TEMPERATURE AS PROBE_2, NULL  AS PROBE_3
            FROM TEMP.A_PROBE
            WHERE PROBE = 2
            UNION
            SELECT DATETIME, NULL  AS PROBE_1, NULL  AS PROBE_2, TEMPERATURE AS PROBE_3
            FROM TEMP.A_PROBE
            WHERE PROBE = 3
          )  
        GROUP BY DATETIME


    Alors là c'est une version avec UNION mais je sais que je n'avais pas d'UNION dans le code MySQL
    Voici une autre version que l'on peut encore tout à faire générer avec Delphi

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            SELECT p1.DATETIME, p1.TEMPERATURE AS PROBE_1, p2.TEMPERATURE AS PROBE_3, p2.TEMPERATURE AS PROBE_3
            FROM TEMP.A_PROBE p1
            FULL OUTER JOIN TEMP.A_PROBE p2 ON p1.DATETIME = p2.DATETIME AND p2.PROBE = 2
            FULL OUTER JOIN TEMP.A_PROBE p3 ON p1.DATETIME = p3.DATETIME AND p3.PROBE = 3
            WHERE p1.PROBE = 1

    on va faire tout ça en PL\SQL

    Code sql : 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
    set serveroutput on;
     
    DECLARE
      vProbeCount INTEGER;
      vStatment VARCHAR2(4000);
    BEGIN
      SELECT MAX(PROBE) into vProbeCount FROM TEMP.A_PROBE;
     
      vStatment := ' SELECT pm.DATETIME ';
      FOR i IN 1..vProbeCount LOOP
        vStatment := vStatment || ', p'||i||'.TEMPERATURE AS PROBE_'||i; 
      END LOOP;
      vStatment := vStatment || '
    FROM (SELECT DISTINCT DATETIME FROM TEMP.A_PROBE) pm '; 
     
      FOR i IN 1..vProbeCount LOOP
        vStatment := vStatment || '
    LEFT JOIN TEMP.A_PROBE p'||i||' ON pm.DATETIME = p'||i||'.DATETIME AND p'||i||'.PROBE = '||i;
      END LOOP; 
     
      vStatment := vStatment || '
    ORDER BY pm.DATETIME';
     
      dbms_output.put_line(vStatment);
    END;



    et si l'on ajoute

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '24/01/2018'      ,       4         ,      21.3          );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '27/01/2018'     ,       4         ,     17.3        );
    INSERT INTO TEMP.A_PROBE (DATETIME, PROBE, TEMPERATURE) VALUES ( '23/01/2018'      ,       4         ,      20.3          );

    cela génère

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT pm.DATETIME , p1.TEMPERATURE AS PROBE_1, p2.TEMPERATURE AS PROBE_2, p3.TEMPERATURE AS PROBE_3, p4.TEMPERATURE AS PROBE_4
    FROM (SELECT DISTINCT DATETIME FROM TEMP.A_PROBE) pm 
    LEFT JOIN TEMP.A_PROBE p1 ON pm.DATETIME = p1.DATETIME AND p1.PROBE = 1
    LEFT JOIN TEMP.A_PROBE p2 ON pm.DATETIME = p2.DATETIME AND p2.PROBE = 2
    LEFT JOIN TEMP.A_PROBE p3 ON pm.DATETIME = p3.DATETIME AND p3.PROBE = 3
    LEFT JOIN TEMP.A_PROBE p4 ON pm.DATETIME = p4.DATETIME AND p4.PROBE = 4
    ORDER BY pm.DATETIME

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    +---------------------+-----------------+-------------------+-------------------+-------------------+
    |      DateTime       |     Probe 1     |      Probe 2      +      Probe 3      +      Probe 4      +
    +---------------------+-----------------+-------------------+-------------------+-------------------+
    |     23/01/2018      |                 |                   |                   +      20.3         +
    +---------------------+-----------------+-------------------+-------------------+-------------------+
    |     24/01/2018      |      21.5       |      22.5         |      23.5         +      21.3         +
    +---------------------+-----------------+-------------------+-------------------+-------------------+
    |     25/01/2018      |      18.5       |      19.5         |      20.5         +                   +
    +---------------------+-----------------+-------------------+-------------------+-------------------+
    |     26/01/2018      |      15.5       |                   |      15.5         +                   +
    +---------------------+-----------------+-------------------+-------------------+-------------------+
    |     27/01/2018      |      17.5       |      18.5         |                   +      17.3         +
    +---------------------+-----------------+-------------------+-------------------+-------------------+
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Mais dommage "ShaiLeTroll, vous n'avez pas la permission d'accéder à cette page"
    Parce que le lien a été modéré pour double post, le bon lien est https://www.developpez.net/forums/d1...l/#post9956819
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Faire des tableaux croisés dynamique
    Par richard038 dans le forum Bases de données
    Réponses: 6
    Dernier message: 12/04/2006, 22h51
  2. Connection MySQL Delphi
    Par MABB dans le forum Installation
    Réponses: 3
    Dernier message: 25/03/2006, 18h58
  3. Tableaux croisés dynamiques et graphiques
    Par Marmouz dans le forum Access
    Réponses: 1
    Dernier message: 24/11/2005, 16h38
  4. MySQL Delphi
    Par bahmani dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/10/2005, 13h19
  5. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 19h26

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