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

Requêtes MySQL Discussion :

Résultat de requete en colonne (mois par mois)


Sujet :

Requêtes MySQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Résultat de requete en colonne (mois par mois)
    Bonsoir,

    J'ai une table des évènements avec un type d'évènement et une date de l'évènement.

    Je veux faire un tableau avec une requête me donnant par type d'évènement les dates de l'évènement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT SUBSTRING(doc_date_emission,1,7) AS 'Mois', 
    libelle, 
    count(t_pub_doc.id_pub_doc) as 'Nombre' 
    FROM `maj_pub_log` 
    LEFT OUTER JOIN t_pub_doc
    ON maj_pub_log.id_pub_doc = t_pub_doc.id_pub_doc
    WHERE t_pub_doc.id_trt BETWEEN 1 AND 4 
    GROUP BY SUBSTRING(doc_date_emission,1,7), t_pub_doc.id_pub_doc
    ORDER BY libelle, SUBSTRING(doc_date_emission,1,7)
    En faisant comme cela, j'ai un enregistrement par mois, alors que je voudrai un enregistrement par type d'évènement avec autant de colonne que de mois.

    Est-ce possible ?

    Merci d'avance

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 039
    Points : 23 787
    Points
    23 787
    Par défaut
    Citation Envoyé par lodan Voir le message
    En faisant comme cela, j'ai un enregistrement par mois, alors que je voudrai un enregistrement par type d'évènement avec autant de colonne que de mois.

    Est-ce possible ?
    Bonjour,
    Autant de colonnes que de mois, sachant qu'à priori tu ne connais pas le nombre de mois à l'avance, ça paraît délicat. A grands coups de jointures avec une jointure par mois, c'est faisable (soit une colonne pour tous les mois, qu'il y ait un évènement ou pas), mais c'est de la cosmétique et un SGBD n'est pas fait pour ça...

    ced

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Sur le fond, je rejoins Ced, faire un tableau croisé c'est le boulot de l'outil de reporting. Si tu as néanmoins besoin de le faire en requête, ce n'est théoriquement possible qu'en connaissant à l'avance la liste des mois, sur le mode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT libelle, 
      CASE 
        WHEN SUBSTRING(doc_date_emission,1,7) = '2008-01' 
        THEN count(t_pub_doc.id_pub_doc) 
        ELSE 0
      END AS Janv08, 
      CASE 
        WHEN SUBSTRING(doc_date_emission,1,7) = '2008-02' 
        THEN count(t_pub_doc.id_pub_doc) 
        ELSE 0
      END AS Fev08, 
    etc.
    Si tu ne connais pas la liste des mois, il ne te reste plus qu'à créer une proc stock effectuant un SELECT DISTINCT, créant dynamiquement une requête sur le modèle ci-dessus et l'exécutant en tant que prepared statement...

  4. #4
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Merci et je vous rejoint tous les 2, c'est pas fait pour cela.

    Antoun tu as dit :

    c'est le boulot de l'outil de reporting
    Que choisir en environnement php/mysql ?

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    une jolie procédure PHP... qui aura besoin de toute façon d'un SELECT DISTINCT.

  6. #6
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Bon

    J'ai négocier 12 mois glissant à partir du mois en cours, ce qui donnerai quelque chose du genre

    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
    SELECT  libelle, 
    CASE 
        WHEN SUBSTRING(doc_date_emission,1,7) = EXTRACT(YEAR_MONTH FROM (CURDATE(), INTERVAL 12 MONTH))
        THEN count(t_pub_doc.id_pub_doc) 
        ELSE 0
      END AS EXTRACT(YEAR_MONTH FROM (CURDATE(), INTERVAL 12 MONTH)), 
      CASE 
        WHEN SUBSTRING(doc_date_emission,1,7) = EXTRACT(YEAR_MONTH FROM (CURDATE(), INTERVAL 11 MONTH))
        THEN count(t_pub_doc.id_pub_doc) 
        ELSE 0
     END AS EXTRACT(YEAR_MONTH FROM (CURDATE(), INTERVAL 11 MONTH))
    ....
    CASE 
        WHEN SUBSTRING(doc_date_emission,1,7) = EXTRACT(YEAR_MONTH FROM (CURDATE(), INTERVAL 1 MONTH))
        THEN count(t_pub_doc.id_pub_doc) 
        ELSE 0
     END AS EXTRACT(YEAR_MONTH FROM (CURDATE(), INTERVAL 1 MONTH))
    Ce n'est pas le plus élégant, mais cela devrait convenir

    Par contre, il n'aime pas mon extract.

    Je ne vois pas d'erreur pourtant.

    Merci d'avance

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    EXTRACT n'utilise pas INTERVAL. je pense qu'il te manque un DATE_SUB.

  8. #8
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Après plusieurs tests, j'ai fini par faire ce select

    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
    SELECT libelle,
    CASE
    WHEN SUBSTRING( doc_date_emission, 1, 7 ) = SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 12
    MONTH ) , 1, 7 )
    THEN count( t_pub_doc.id_pub_doc )
    ELSE 0
    END AS SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 12
    MONTH ) , 1, 7 ) ,
    CASE
    WHEN SUBSTRING( doc_date_emission, 1, 7 ) = SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 11
    MONTH ) , 1, 7 )
    THEN count( t_pub_doc.id_pub_doc )
    ELSE 0
    END AS SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 11
    MONTH ) , 1, 7 )
    J'ai l'erreur
    #1064 - Erreur de syntaxe près de 'SUBSTRING(DATE_SUB(CURDATE(), INTERVAL 12 MONTH),1,7),
    Je suis sous mysql 4.1.9

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Il ne te manquerait pas un alias et une virgule entre le END et le AS ?

  10. #10
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Oui c'est vrai que si je mets
    END AS 'Date'
    ça va mieux.

    Mais c'est la date que je veux mettre, pas une constante.

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Tu ne peux pas. Que dirais-tu de AS `M-12` ?

  12. #12
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    C'est triste comme réponse, snif ...

    mais, je crois que je vais faire avec

    Merci pour tout

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

Discussions similaires

  1. [VxiR2] Du 12 mois flottant mois par mois?
    Par EmmanuelleC dans le forum Designer
    Réponses: 4
    Dernier message: 13/04/2011, 12h01
  2. [AC-2007] Sélectionner les résultats d'une requête analyse croisée par mois
    Par cslbcg dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 03/12/2009, 16h21
  3. Requete pour regouper mois par mois
    Par Rasta63 dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/06/2008, 16h50
  4. [MySQL] Requête ordonnant les résultats par mois
    Par DukyGeorge dans le forum Langage SQL
    Réponses: 12
    Dernier message: 15/05/2006, 19h48
  5. [MySQL] requete avec cumul mois par mois
    Par michaelbob dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/01/2006, 15h32

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