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 :

Requête tableau croisé


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut Requête tableau croisé
    Bonjour,

    J'ai construit une requête qui me compte le nombre d’échantillon par station
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select eqstns.stndesc, eqstns.stncode, count(SampleId) as Count_of_Samples from eqstns, eqsampls
    where eqstns.StnId = eqsampls.StnId 
    group by eqstns.StnCode, eqstns.StnDesc
    Je voudrais introduire la date pour avoir le nombre d'echantillon par station et par mois comme présenté en fichier joint. Comment rédiger la requête?

    Merci d'avance.
    Images attachées Images attachées  

  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 034
    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 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Les jointures ne s'écrivent plus en séparant les tables par des virgules depuis 1992... Passez à une écriture normalisée, avec la syntaxe INNER JOIN ... ON...
    Sinon, pour votre question, c'est effectivement faisable à coup de jointures, mais tout ça, c'est de la cosmétique et le SQL n'est pas fait pour ça.
    En effet, le jour où vous ajoutez une station, il faudra alors ajouter une jointure à votre requête pour qu'elle continue à renvoyer un résultat cohérent.
    Bref, l'affichage sous forme de "tableau croisé dynamique", c'est le rôle du langage de programmation qui lance la requête.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 271
    Points : 491
    Points
    491
    Par défaut
    Tu n'es pas obligé d'écrire le nom de la table avant chaque nom de colonne sauf en cas d'ambiguité.
    Si tu ajoutes la date datesampls, ta requête pourrait s'écrire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT stncode, DATE_FORMAT(datesampls, '%M') AS monthsampls, count(SampleId) AS Count_of_Samples 
    FROM eqsampls 
    INNER JOIN eqstns ON eqstns.StnId = eqsampls.StnId 
    WHERE datesampls BETWEEN '2008-01-01' AND '2008-12-31'
    GROUP BY MONTH(datesampls), StnCode
    Tu devras écrire un programme qui récupère ces données et dessine ton tableau croisé et ce quelles que soient les stations.
    Une autre idée serait de faire le tableau croisé comme ceci si le nombre de stations ne change pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DATE_FORMAT(datesampls, '%M') AS monthsampls, 
    COUNT(IF(StnCode='BM',SampleId,NULL)) AS BM,
    COUNT(IF(StnCode='CHB',SampleId,NULL)) AS CHB,
    COUNT(IF(StnCode='Cilerne',SampleId,NULL)) AS Cilerne
    COUNT(IF(StnCode='EKALF',SampleId,NULL)) AS EKALF
    COUNT(IF(StnCode='EPCU3',SampleId,NULL)) AS EPCU3
    COUNT(IF(StnCode='ETATI1F',SampleId,NULL)) AS ETATI1F
    COUNT(IF(StnCode='ETATI2F',SampleId,NULL)) AS ETATI2F
    COUNT(IF(StnCode='EUB2',SampleId,NULL)) AS EUB2
    FROM eqsampls 
    INNER JOIN eqstns ON eqstns.StnId = eqsampls.StnId 
    WHERE datesampls BETWEEN '2008-01-01' AND '2008-12-31'
    GROUP BY MONTH(datesampls), StnCode
    Sinon, il faudrait prévoir de générer cette requête a travers un programme pour gérer n'importe quel nombre de stations.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Citation Envoyé par fab256 Voir le message
    Tu n'es pas obligé d'écrire le nom de la table avant chaque nom de colonne sauf en cas d’ambigüité.
    Mais c'est tellement plus parlant quand toutes les colonnes sont qualifiées du nom de table correspondant ou, plus pratique, de l'alias.
    Il n'est alors pas nécessaire de connaître par coeur la structure de toutes les tables utilisées dans la requête pour la comprendre et la faire évoluer.
    Et, en plus, ça simplifie la vie de l'analyseur syntaxique

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Bonjour,
    J'utilise postgresl j’essaie d’executer la requête mais j’ai l’erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ERREUR:  la fonction if(boolean, integer, unknown) n'existe pas
    LINE 3: COUNT(IF(StnCode='BM',SampleId,NULL)) AS BM,
                  ^
    HINT:  Aucune fonction ne correspond au nom donné et aux types d'arguments.
    Vous devez ajouter des conversions explicites de type.
    Merci

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Avec COUNT(CASE StnCode WHEN 'BM' THEN SampleId ELSE NULL END) AS BM, ça fonctionnera mieux

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 29
    Points
    29
    Par défaut
    Merci la requête marche

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

Discussions similaires

  1. SQL Serveur: requête tableau croisé
    Par Gilles93 dans le forum Développement
    Réponses: 10
    Dernier message: 24/02/2015, 17h05
  2. Requête -> tableau croisé et autres besoins statistiques
    Par Perplexe dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/02/2010, 15h38
  3. Récupérer la requéte sql d'un tableau croisé en vba
    Par snipeurcoq dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/07/2008, 14h14
  4. Requête tableau croisé
    Par mulanzia2003 dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 12/10/2007, 11h15
  5. Requête tableau croisé dynamique + état
    Par willytito dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/07/2006, 15h23

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