[access] limiter les resultats retournés dans un group by - Résolu !

limiter les resultats retournés dans un group by - Résolu ! [access] - SQL/NoSQL - Programmation

Marsh Posté le 17-10-2006 à 16:57:44    

bonjour,  
j'ai une table matable :
 
id    flag  ordre
-------------
titi   0    1
titi   1    2  
titi   0    3
titi   1    4
titi   0    10
titi   1    25
titi   0    40
titi   1    42
toto 1    1
toto 1    2  
toto 0    3
toto 1    5
toto 1    15
toto 1    25
toto 0    40
toto 1    42
 
je voudrais une creer une requete en SQL access qui me permette de selectionner pour chaque id les 4 premiers enregistrement trié par ordre et qui  me compte parmi ces 4 enregistrements le nombre de flag à vrai et me  
 retourner le resultat suivant :  
 
id     nbflag      
------------
titi    2
toto  3
 
Merci bcp ! :jap:


Message édité par crashman le 19-10-2006 à 15:45:04
Reply

Marsh Posté le 17-10-2006 à 16:57:44   

Reply

Marsh Posté le 19-10-2006 à 14:03:13    

Bonjour
 
voici une solution un peu cochonne car elle n'est pas très paramétrable, et exige que ton champ "ordre" soit le même pour "titi" et "toto"
(pas question pour que cette solution fonctionne, que tu aies titi ordre 1 2 3 4 et toto ordre 5 6 7 8 par exemple...
 
1. Tu crées une query "Ma_query" avec cet ordre SQL :  
SELECT TOP 8 id, flag
FROM matable
ORDER BY matable.ordre;

 
2. Tu crées une autre requête qui a cet ordre SQL :  
SELECT id, count(1) AS nbflag
FROM Ma_query
WHERE flag=1
GROUP BY id;

 
(Pas envie de relancer l'éternel débat sur count(champ) donc tu mets ce que tu veux à la place du (1), ou tu le laisses, c'est pareil :) )
 
Output de la deuxième requête :
id - nbflag
titi - 2
toto - 3
 
Voilà ce n'est pas clean mais ça marche ...  
 
Sinon j'irais voir du côté des ruptures avec des macros, tu dois pouvoir bricoler ça en Access.
 
 
 

Reply

Marsh Posté le 19-10-2006 à 15:44:22    

merci zebix,  
mais comme tu l'as dis cela exige que titi et toto aient un ordre bien defini (mon ordre etant en réalité une date...), j'ai eu une autre reponse d'un collegue assez ingeneuse :recreer un ordre 'virtuel'
 
SELECT rs.id, Sum(rs.flag) AS SommeDeflag
FROM [SELECT table1.id, table1.flag, table1.ordre, (select count(table2.id) from table1 table2 where table2.id = table1.id and table2.ordre >= table1.ordre) AS nombre
FROM table1
ORDER BY table1.ordre desc
         ]. AS rs
WHERE (((rs.nombre)<=4))
GROUP BY rs.id;
 
 
@+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed