[Résolu][SQL/ACCESS] Problème COUNT / GROUP BY

Problème COUNT / GROUP BY [Résolu][SQL/ACCESS] - SQL/NoSQL - Programmation

Marsh Posté le 19-03-2010 à 00:59:54    

Bonjour à tous,   :hello:  
Voici mon problème:
Je souhaite récupérer un nombre dé "déposes" de pièces de moteur pour les 12 prochains mois, en regroupant toutes les memes déposes pour un couple Type de moteur/Type de Pièce. Voici ma requête actuelle :  
 
SELECT QRY.VariantName, QRY.CategoryPartName, (SELECT COUNT(QRY.FirstForecast) FROM qryDetailedEnginesWithCountersAndForecastsForCHL AS QRY WHERE CVDate(QRY.FirstForecast) BETWEEN CVDate(Format(Date(),"Short Date" )) AND CVDate(Format(DateAdd("yyyy",1,Date()),"Short Date" ))) AS FirstYearRemovalCount
FROM qryDetailedEnginesWithCountersAndForecastsForCHL AS QRY
GROUP BY QRY.VariantName, QRY.CategoryPartName;
 
Alors pour l'affichage des couples uniques de Moteurs/Pièces c'est ok, par contre le count m'affiche le total de déposes concernées par les 12 mois dans toutes les lignes... Hors je voudrais que ces déposes s'affichent par couples. Je pense pas être très loin mais j'ai retourné le truc dans tous les sens et pas moyen de le faire fonctionner correctement. Par ailleurs je dois normalement avoir dans le count un autre champ "SecondForecast" ou j'effectue les mêmes opérations (mais je pense que si je fais un UNION ALL ca devrait le faire non?)
 
Merci d'avance.


Message édité par kojiro64 le 19-03-2010 à 13:06:40
Reply

Marsh Posté le 19-03-2010 à 00:59:54   

Reply

Marsh Posté le 19-03-2010 à 07:40:58    

c'est quoi cette sous-requête dans la partie select?[:pingouino]
Un truc de ce genre devrait répondre à la question non?
 

Code :
  1. SELECT variantname, categorypartname, count(*)
  2. FROM qryDetailedEnginesWithCountersAndForecastsForCHL
  3. WHERE CVDate(FirstForecast) BETWEEN CVDate(Format(Date(),"Short Date" )) AND CVDate(Format(DateAdd("yyyy",1,Date()),"Short Date" )))
  4. GROUP BY  variantname, categorypartname;


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 19-03-2010 à 09:09:58    

En effet je pensais qu'il n'était pas nécessaire d'ajouter quelques détails à ce problème, mais en fait ils s'avèrent nécessaires. Je dois faire en fait 7 colonnes qui correspondent aux 7 prochaines années, voila pourquoi je ne pouvais pas mettre mon WHERE en dehors de ma sous requête. De plus cette requête que tu me proposes n'affiche pas les lignes ou il y a 0 déposes, et j'ai besoin de les avoir... Bref je bloque.

Reply

Marsh Posté le 19-03-2010 à 09:42:42    

si tu veux 7 années différentes ce sera plutôt 7 lignes que 7 colonnes.
par contre pour les lignes avec des 0 s'il n'y a rien dans la table qryDetailedEnginesWithCountersAndForecastsForCHL ça va être dur de les remonter dans connaitre la table d'origine.

 

Pour les 7 années tu dois pouvoir t'arranger avec un truc comme ça (pour les fonctions de dates je connais pas le sgbd que tu utilises, donc c'est du freestyle):

 
Code :
  1. SELECT variantname, categorypartname, Format(FirstForecast, 'yyyy') AS annee, count(*)
  2. FROM qryDetailedEnginesWithCountersAndForecastsForCHL
  3. WHERE annee BETWEEN annee_courante AND annee_courante + 7
  4. GROUP BY  variantname, categorypartname, annee;


Message édité par skeye le 19-03-2010 à 09:43:28

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 19-03-2010 à 09:52:37    

Salut skeye,
En fait j'ai une demande assez précise, je dois avoir tous les couples de variant/category (moteur/piece) visibles, memes s'ils ont 0 déposes, et bien 7 colonnes pour les 7 prochaines années, avec 1 année commençant au moment du lancement de la requête (ici mars) et se terminant 12 mois plus tard.
Voila l'exemple que je souhaite avoir :
variant   cat       annee1   annee2   annee3   ... annee7
Moteur1 Piece1   0           2            0               1
Moteur1 Piece2   2           3            5               2
Moteur1 Piece3   0           0            1               1
Moteur2 Piece1   1           3            4               6
Moteur2 Piece2   0           0            1               0
Moteur2 Piece3   1           2            2               1

Reply

Marsh Posté le 19-03-2010 à 09:55:42    

Pour l'affichage des 0 j'ai retrouvé un vieux topic de 2003 avec ca :  
 
SELECT description,count(*)
  FROM ma_table
  GROUP BY description
  WHERE date BETWEEN date1 AND date2  
UNION
SELECT description,0
  FROM ma_table
  GROUP BY description
  WHERE date NOT BETWEEN date1 AND date2
 
Malheureusement avec ma sous requête cela provoque une erreur (je pense qu'il ne veut pas de UNION dans une sous requête), et sinon je suis sous ACCESS 2002 :/

Reply

Marsh Posté le 19-03-2010 à 09:58:37    

Le plus simple est de partir d'une variante de la requête que j'ai postée (en calculant les années différemment), et de traiter le résultat de cette requête dans le langage appelant...
Obtenir exactement le résultat que tu veux en une seule requête est probablement faisable, mais complètement lourdingue à écrire, pour un intérêt a priori limité.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 19-03-2010 à 10:19:16    

J'aimerais bien pouvoir calculer les années différemment, mais malheureusement je dois me coller strictement au modèle que je t'ai montré...

Reply

Marsh Posté le 19-03-2010 à 10:21:43    

Quand je parle de les calculer différemment, c'est dans ma requête, pas dans le principe.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 19-03-2010 à 11:13:45    

Problème résolu !  
Mon salut est passé par la fonction SUM :
 
SELECT QRY1.VariantName, QRY1.CategoryPartName, SUM( IIf(CVDate(QRY1.FirstForecast) BETWEEN CVDate(Format(Date(),"Short Date" )) AND CVDate(Format(DateAdd("yyyy",1,Date()),"Short Date" )),1,0)) AS FirstYearRemovalCount
FROM qryDetailedEnginesWithCountersAndForecastsForCHL AS QRY1
GROUP BY QRY1.VariantName, QRY1.CategoryPartName;
 
J'ai plus qu'a faire la meme chose pour toutes les autres années.

Reply

Marsh Posté le 19-03-2010 à 11:13:45   

Reply

Marsh Posté le 27-03-2010 à 18:47:14    

Bonjour,
Dans l’exemple résolu vous traiter d’une requête avec une seule table et un seul groupe ! J’ai un problème plus complexe :
Dans une requête constituée de 3 tables ([xTP-Patient] ; [xTP-Facture] ; [xTP-DetailActes]) liée entre elles et groupée selon la “Date_facture”, je voudrais pour chaque journée afficher (calculer) le nombre de personnes de sexe masculin (Titre = Mr) et celle de sexe féminin (Titre = Mme) et le nombre de Consultations (Acte=Consultation) et Controle (Acte=Controle)!  
Je ne voudrais pas créer une requête analyse croisée car j’ai deux en-têtes de colonnes (Titre et Acte) à créer ce qui est impossible !
Le code suivant :
SELECT [xTP-Facture].date_facture, Count([xTP-Patient].Id) AS CompteDeId, Count([xTP-Patient].Titre) AS CompteDeTitre, Count([xTP-DetailActes].Acte3) AS CompteDeActe3, DCount("[id]","xtp-Patient","[titre] = 'Mme' " ) AS Mme
FROM [xTP-Patient] INNER JOIN ([xTP-Facture] INNER JOIN [xTP-DetailActes] ON [xTP-Facture].n_facture = [xTP-DetailActes].N_fact) ON [xTP-Patient].Id = [xTP-Facture].Id
GROUP BY [xTP-Facture].date_facture;
M’affiche pour chaque journée le nombre total des consultants (pour les colonnes 2, 3 et 4)  et le nombre total des femmes de toutes la base de données, j’ai pas encore introduits les autres expressions (Mr, Consultation, Contrôle).
Comment dois-je faire merci

Reply

Sujets relatifs:

Leave a Replay

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