Compter avec SQL

Résolu
roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 - 18 mars 2005 à 22:49
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 16 sept. 2005 à 21:55
Bonjour (Bonsoir) à vous tous.


Ma question concerne plutôt SQL que delphi, mais je n'ai pas trouvé ce language sur CodeS-SourceS. Quelqu'un pourra peut-être quand même m'aider ...

Voici un exemple de ce que je voudrai faire :


Soit la table dont la première colonne est COULEUR et la 2nde LETTRE et qui contient les valeurs suivantes.
rouge A
bleu B
vert A
vert C
bleu C
vert A
rouge C
rouge C
bleu B


Je voudrais avoir comme résultat de la requète, une table contenant une ligne par couleur et une colonne par lettre indiquant le nombre de couples Couleur/Lettre trouvés dans la table :


rouge 1(nombre de A) 0(nombre de B) 2(nombre de C)
bleu 0 2 1
vert 2 0 1

J'ai essayé avec des Count et Group by, mais je ne crois pas être sur le bon chemin. J'utilise Paradox. Si quelqu'un a une idée ...

Merci d'avance

Roud59

5 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
16 sept. 2005 à 14:47
Mieux vaut tard que jamais et cette question m'a longtemps trotté dans la tête, d'autant qu'avec Paradox, il faut utiliser d'un subterfuge que je ne connaissais pas en ce qui concerne les requêtes imbriquées.

1/- Créer une sous requête et l'enregistrer dans
un fichier nommé, par exemple, subquery.sql et à mettre dans le chemin déclaré dans l'alias utilisé:

select couleur, count(*) as A, cast(0 as integer) as B, cast(0 as integer) as C
from couleurs
-- compter le nombre de A
where lettre = "A"
group by couleur
having (count(*) > 0)


union
select couleur, 0 as A, count(*) as B, 0 as C
from couleurs
-- compter le nombre de B
where lettre = "B"
group by couleur
having (count(*) > 0)


union
select couleur, 0 as A, 0 as B, count(*) as C
from couleurs
-- compter le nombre de C
where lettre = "C"
group by couleur
having (count(*) > 0)


2 /- Taper la requête suivante :
-- faire la synthèse des résultats de la requête ci-dessus
select s.couleur, sum(s.a) as A, sum(s.b) as B, sum(s.c) as C
from subquery.sql as s
group by couleur
order by couleur


et le tour est joué.


/* Il est à noter qu'avec un SGBD supportant la
norme SQL 2, il suffisait d'écrire :
*/
select s.couleur, sum(s.a) as A, sum(s.b) as B, sum(s.c) as C
from (
select couleur, count(*) as A, cast(0 as integer) as B, cast(0 as integer) as C
from couleurs
where lettre = "A"
group by couleur
having (count(*) > 0)


union
select couleur, 0 as A, count(*) as B, 0 as C
from couleurs
where lettre = "B"
group by couleur
having (count(*) > 0)


union
select couleur, 0 as A, 0 as B, count(*) as C
from couleurs
where lettre = "C"
group by couleur
having (count(*) > 0)
) as s
group by couleur
order by couleur


Le résultat est exactement celui attendu.
Même si la réponse arrive bien tard, j'ai pensé qu'il serait intéressant de la porter à la connaissance de tous.


<HR color=#008000>



Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
19 mars 2005 à 12:08
"Ma question concerne plutôt SQL que delphi, mais je n'ai pas trouvé ce language sur CodeS-SourceS. Quelqu'un pourra peut-être quand même m'aider ..."
C'est simple : http://www.sqlfr.com

Pour le reste de la question, on continue de chercher, patience...


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.pourflorenceethussein.org
0
roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 2
19 mars 2005 à 12:49
Merci pour ta réponse Delphiprog.

sqlfr.com ... j'avais pas vu, désolé.

Je vais chercher dans les posts de ce site au cas où j'aurais une réponse.
Mais si quelqu'un a une solution ici, je prends. Je suis patient: en attendant, je peux toujours coder ça à la main en parcourant la table.

Merci

Roud59
0
roud59 Messages postés 99 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 26 juillet 2007 2
16 sept. 2005 à 18:07
Merci beaucoup Delphiprog et j'espère que ma question ne t'as pas empéché de vivre normalement depuis ce temps là...
Je n'attendais plus de réponse, surtout que j'avais posé la question sur sqlfr (merci de ton conseil) mais sans avoir de réponse satisfaisante.
J'ai donc lu avec intérêt ta proposition et on arrive effectivement au résulat voulu mais ça ne résout pas complèment mon problème car tu supposes que le résulat aura 3 colonnes (A,B,C). Si on ajoute des 'D' dans la table, la requète telle qu'elle est écrite ne sortira pas le compte de 'D'.
Une solution serait donc 1) examiner les différentes lettres (select distinct Lettre from UneTable) 2) créer dynamiquement les requètes en créant autant de colonnes que de lignes trouvées au 1)
Pour ma part, comme je n'ai pas vraiment trouvé de solution, j'ai fait simplement :
select Couleur,Lettre,Count(*) from UneTable
group by Couleur,Lettre
ce qui donne :
bleu B 2
bleu C 1
rouge A 1
rouge C 2
vert A 2
vert C 1
Comme le but est d'afficher les résultats, je les présente dans une StringGrid. Je parcours alors ma query ligne à ligne, si la colonne (lettre) ou la ligne (couleur) n'existe pas dans la grid, je la crée puis je mets le nombre de couples indiqué. J'obtient mon résultat avec une requète unique et peu de code, mais c'est pas dans un dbgrid.


D'après un spécialiste, certains systèmes SGBD proposent exactement ce que je veux vaire : du comptage avec le nombre de colonnes inconnu lors de l'écriture de la requète. Je ne me souviens plus de la base ni du nom de cette forme de requète. J'essayerais de retrouver cette info et je la posterais.


Comme toi, je porte ma solution à la conaissance de tous. Je l'avais pas fait avant car je trouvais mon problème trop spécifique et ma solution peu élégante mais si tu t'y es intéressé, pourquoi pas d'autres ?


Merci encore Delphiprog!


Roud59
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
16 sept. 2005 à 21:55
Il est vrai que je ne me suis pas intéressé au fait de rendre la requête plus "généraliste" en ne précisant pas le nombre de colonnes. Je me suis dit que ce n'était pas le bout du monde s'il n'y avait que 3 colonnes.
Cela dit, Paradox n'implémente pas complètement la norme SQL 2 comme je l'ai dit plus haut et il n'est pas évident d'aboutir à une solution simple et satisfaisante.
Mais le sujet m'intéresse et je le considère comme un challenge, je me remets donc à rechercher sans que cela m'empêche de dormir.

On continue le sujet ici ou sur SqlFr ?

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Rejoignez-nous