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

Langage SQL Discussion :

Tableau un peu spécial, comment faire pour l'obtenir avec des requetes sql ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut Tableau un peu spécial, comment faire pour l'obtenir avec des requetes sql ?
    Bonjour,

    De retour après 2 longues années d'absence...
    Bon, avant je venais surtout pr des questions PHP, aujourd'hui, j'ai besoin d'aide en SQL.

    J'ai 2 tables (je ne mets que les champs nécessaire à la résolution de mon probleme) :
    TABLE 1 : TACHE
    NUMTACHE : Numéro de tache
    TYPTACHE : Type de tache

    TABLE 2 : GEST (GESTIONNAIRE)
    NUMTACHE : Numéro de tache
    NOMGEST : Nom du gestionnaire
    DEBGEST : Date de début de gestion
    FINGEST : Date de fin de gestion

    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
    TACHE
    NUMTACHE  TYPTACHE
    --------  ----------
    NUM01     CREUSER
    NUM02     PLANTER
    NUM03     COUVRIR
    NUM04     ARROSER
    
    GEST
    NUMTACHE  NOMGEST  DEBGEST   FINGEST
    --------  -------  -------   -------
    NUM01     LINOU    20090601   20090601  
    NUM01     PASCAL   20090603   20090604  
    NUM02     LINOU    20090602   20090603  
    NUM03     PIERRE   20090603   20090605  
    NUM04     LINOU    20090606   20090608
    NUM04     PIERRE   20090609   20090611
    NUM04     PASCAL   20090613   20090615
    Afin de réaliser un GANTT, il faut que j'obtienne le tableau suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    |---------------------------------------------------------------------------|
    |        |         LINOU        |      PASCAL         |   PIERRE            |
    |---------------------------------------------------------------------------|
    |NUM01   |  20090601 | 20090601 | 20090603 | 20090604 |          |          |
    |---------------------------------------------------------------------------|
    |NUM02   |  20090602 | 20090603 |          |          |          |          |
    |---------------------------------------------------------------------------|
    |NUM03   |           |          |          |          | 20090603 | 20090605 |
    |---------------------------------------------------------------------------|
    |NUM04   |  20090606 | 20090608 | 20090613 | 20090615 | 20090609 | 20090611 |
    |---------------------------------------------------------------------------|
    Mon problème :
    comment ramener d'abord les gestionnaires, puis renseigner les taches + les dates.

    Je peux faire plusieurs selects, mais pas de tableau imbriqué.

    J'espère que c'est clair et que je suis au bon endroit...
    Merci pr le coup de main

    Linou

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est possible en pur SQL uniquement si vos gestionnaires sont connus à l'avance.

    Sinon il faudra construire la requête SQL.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Waldar Voir le message
    C'est possible en pur SQL uniquement si vos gestionnaires sont connus à l'avance.

    Sinon il faudra construire la requête SQL.
    J'entend bien, mais ça ne m'aide pas beaucoup!... Justement, comment contruire cette requête?... Là est tout mon problème...

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avec votre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        t.NUMTACHE,
        MAX(CASE g.NOMGEST WHEN 'LINOU'  THEN g.DEBGEST ELSE NULL END) AS DEBGEST_LINOU,
        MAX(CASE g.NOMGEST WHEN 'LINOU'  THEN g.FINGEST ELSE NULL END) AS FINGEST_LINOU,
        MAX(CASE g.NOMGEST WHEN 'PASCAL' THEN g.DEBGEST ELSE NULL END) AS DEBGEST_PASCAL,
        MAX(CASE g.NOMGEST WHEN 'PASCAL' THEN g.FINGEST ELSE NULL END) AS FINGEST_PASCAL,
        MAX(CASE g.NOMGEST WHEN 'PIERRE' THEN g.DEBGEST ELSE NULL END) AS DEBGEST_PIERRE,
        MAX(CASE g.NOMGEST WHEN 'PIERRE' THEN g.FINGEST ELSE NULL END) AS FINGEST_PIERRE
    FROM
        TACHE t
        LEFT OUTER JOIN GEST g
          ON g.NUMTACHE = t.NUMTACHE
    GROUP BY
        t.NUMTACHE
    La partie à construire ce sont les max(case), avec un langage type PHP ou PL/SQL.
    Mais si vous construisez ce genre de requête en PHP, c'est peut-être plus simple de faire le simple select et de constuire le tableau dans ce langage.
    A vous de voir, je ne connais pas vos contraintes.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Avec votre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        t.NUMTACHE,
        MAX(CASE g.NOMGEST WHEN 'LINOU'  THEN g.DEBGEST ELSE NULL END) AS DEBGEST_LINOU,
        MAX(CASE g.NOMGEST WHEN 'LINOU'  THEN g.FINGEST ELSE NULL END) AS FINGEST_LINOU,
        MAX(CASE g.NOMGEST WHEN 'PASCAL' THEN g.DEBGEST ELSE NULL END) AS DEBGEST_PASCAL,
        MAX(CASE g.NOMGEST WHEN 'PASCAL' THEN g.FINGEST ELSE NULL END) AS FINGEST_PASCAL,
        MAX(CASE g.NOMGEST WHEN 'PIERRE' THEN g.DEBGEST ELSE NULL END) AS DEBGEST_PIERRE,
        MAX(CASE g.NOMGEST WHEN 'PIERRE' THEN g.FINGEST ELSE NULL END) AS FINGEST_PIERRE
    FROM
        TACHE t
        LEFT OUTER JOIN GEST g
          ON g.NUMTACHE = t.NUMTACHE
    GROUP BY
        t.NUMTACHE
    La partie à construire ce sont les max(case), avec un langage type PHP ou PL/SQL.
    Mais si vous construisez ce genre de requête en PHP, c'est peut-être plus simple de faire le simple select et de constuire le tableau dans ce langage.
    A vous de voir, je ne connais pas vos contraintes.
    Merci pour votre réponse.
    Le truc, c'est que vous êtes parti du principe que j'avais seulement 3 gestionnaires alors que je peux en avoir 1000...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je me demande si vous lisez les textes que j'écris, si ce n'est pas clair expliquez ce que vous ne comprenez pas :
    C'est possible en pur SQL uniquement si vos gestionnaires sont connus à l'avance.
    Sinon il faudra construire la requête SQL.
    La partie à construire ce sont les max(case), avec un langage type PHP ou PL/SQL.
    Vous savez à quelle requête vous devez arriver, je pense que vous pouvez finir tout seul surtout si vous avez de l'expérience en php, mais encore une fois :
    Mais si vous construisez ce genre de requête en PHP, c'est peut-être plus simple de faire le simple select et de constuire le tableau dans ce langage.
    A vous de voir, je ne connais pas vos contraintes.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 171
    Points : 70
    Points
    70
    Par défaut
    Je crois que vous ne m'avez pas compris, mais en relisant mon 1er post, je pense que c'est de ma faute.

    Je veux obtenir un tableau du genre de l'exemple que j'ai mis, mais c'est un tableau HTML qu'il me faut, et non le résultat d'un requête.
    Si je regarde votre réponse, vous mettez l'en-tête de colonne en utilisant "AS", mais on est dans le SQL.

    moi je veux quelque chose comme ca :
    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
    <table>
    	<tr>
    		<td></td>
    		<td colspan="2">LINOU</td>
    		<td colspan="2">PASCAL</td>
    		<td colspan="2">PIERRE</td>
    	</tr>
    	<tr>
    		<td>NUM01</td>
    		<td>20090601</td>
    		<td>20090601</td>
    		<td>20090603</td>
    		<td>20090604</td>
    		<td></td>
    		<td></td>
    	</tr>
    	<tr>
    		<td>NUM02</td>
    		<td>20090602</td>
    		<td>20090603</td>
    		<td></td>
    		<td></td>
    		<td></td>
    		<td></td>
    	</tr>
    	<tr>
    		<td>NUM03</td>
    		<td></td>
    		<td></td>
    		<td></td>
    		<td></td>
    		<td>20090603</td>
    		<td>20090605</td>
    	</tr>
    	<tr>
    		<td>NUM04</td>
    		<td>20090606</td>
    		<td>20090608</td>
    		<td>20090613</td>
    		<td>20090615</td>
    		<td>20090609</td>
    		<td>20090611</td>
    	</tr>
    </table>
    Et je ne fais pas du php, j'utilise un outil donc je dois passer par du html.

    Merci

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui effectivement ça n'a plus rien à voir avec le langage SQL - vous savez, le titre de ce forum

    Tentez votre chance par là : http://www.developpez.net/forums/f39...l-dhtml-xhtml/

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Y'a pas de miracle, si vous pouvez avoir un nombre variable de gestionnaires, vous devez générer votre code dynamiquement à partir de ce que vous avez dans votre table, c'est ce qu'essaie de vous faire comprendre Waldar.

    Je verrai quelque chose comme ça, en gros :

    - Récupérer la liste des gestionnaires distints de votre table (dans un curseur par exemple)

    - Construire votre requête dans une variable (exemple en pl sql)
    -> Début de requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete := 'SELECT t.NUMTACHE'
    -> Partie variable de la requete, en bouclant sur les gestionnaires, on ajoute pour chacun :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete := requete || ',MAX(CASE g.NOMGEST WHEN ''' || curseur.NomGest || ''' THEN g.DEBGEST ELSE NULL END) AS DEBGEST_' || curseur.NomGest || ',MAX(CASE g.NOMGEST WHEN ''' || curseur.NomGest || ''' THEN g.FINGEST ELSE NULL END) AS FINGEST_' || curseur.NomGest ||;
    -> Fin de la requête, après la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete := requete || ' FROM TACHE t LEFT OUTER JOIN GEST g ON g.NUMTACHE = t.NUMTACHE GROUP BY t.NUMTACHE'
    - Generer votre code HTML, en bouclant sur les gestionnaires pour les entetes, puis sur la requête construite pour former votre tableau.

    On ne sait pas sur quel SGBD vous travaillez, ni ce que vous utilisez pour générer votre code HTML.
    N'hésitez pas à nous donner plus de détails.
    Bon courage.

Discussions similaires

  1. Comment faire pour une interface avec un menu ribbon ? sans onglet
    Par Yogy dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 20/01/2010, 15h58
  2. Réponses: 1
    Dernier message: 10/06/2007, 07h22
  3. Réponses: 17
    Dernier message: 14/06/2006, 17h20
  4. Réponses: 4
    Dernier message: 05/01/2006, 09h01
  5. Réponses: 7
    Dernier message: 21/04/2005, 15h55

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