Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/07/2011, 11h35   #1
Invité régulier
 
Inscription : août 2006
Messages : 38
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 38
Points : 8
Points : 8
Par défaut Requête tableau croisé

Bonjour,

J'ai construit une requête qui me compte le nombre d’échantillon par station
Code :
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
Type de fichier : jpg Tableau_croise.JPG (14,0 Ko, 14 affichages)
izeba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 22h53   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 00h22   #3
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
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 :
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 :
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.
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 04/07/2011, 12h11   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
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
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/07/2011, 17h38   #5
Invité régulier
 
Inscription : août 2006
Messages : 38
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 38
Points : 8
Points : 8
Bonjour,
J'utilise postgresl j’essaie d’executer la requête mais j’ai l’erreur suivante :
Code :
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
izeba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 18h02   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Avec COUNT(CASE StnCode WHEN 'BM' THEN SampleId ELSE NULL END) AS BM, ça fonctionnera mieux
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 19h43   #7
Invité régulier
 
Inscription : août 2006
Messages : 38
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 38
Points : 8
Points : 8
Merci la requête marche
izeba est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h11.


 
 
 
 
Partenaires

Hébergement Web