web-dev-qa-db-fra.com

Compter les éléments distincts dans une fonction d'agrégation de groupe par dans Access 2007 SQL

Bonjour, j'ai parcouru le forum pendant un moment et je pose ma première question ici. Je suis un peu dans une impasse et je me demandais si je pouvais obtenir de l'aide. J'utilise Access 2007 et je n'ai pas encore trouvé de bonne réponse à la question sur le net.

Mes données sont des codes de diagnostic et des codes d'identification de client. Ce que je recherche, c'est pourquoi trouver le nombre distinct d'identificateurs de client pour chaque code de diagnostic. Idéalement, dans SQL non-Access, cela ressemblerait à ceci:

SELECT DiagCode, Count(Distinct(CustomerID))
FROM CustomerTable
Group By DiagCode;

Je sais que la question est assez simple, mais les réponses que je trouve sont soit trop compliquées (fonctions d'agrégats multiples), soit trop simples. Voici une approche que j'ai faite pour le résoudre, mais cela donne trop de résultats:

SELECT DiagCode, Count(CustomerID)
FROM CustomerTable
WHERE CustomerID in (SELECT Distinct CustomerID from CustomerTable)
Group By DiagCode;

J'espère que je suis clair comme je l'ai dit mon premier post et toute aide est appréciée.

4
Thescanswer

Je ne suis pas expert en MS Access et la dernière fois que j'ai écrit quelque chose, c'est assez long, mais cela fonctionnera peut-être:

SELECT cd.DiagCode, Count(cd.CustomerID)
FROM (select distinct DiagCode, CustomerID from CustomerTable) as cd 
Group By cd.DiagCode;
6
gzaxx

J'avais la même question et j'ai trouvé un lien (maintenant disparu) de l'équipe d'accès de Microsoft pour avoir un exemple pratique de Nice permettant d'accomplir cela. que je vais également inclure ci-dessous.


Les données:

Color   Value
Red     5
Green   2
Blue    8
Orange  1
Red     8
Green   6
Blue    2

Pour obtenir un décompte du nombre de couleurs uniques dans la table, vous pouvez écrire une requête telle que:

SELECT Count(Distinct Color) AS N FROM tblColors

Cela renverrait la valeur 4 car il y a quatre couleurs uniques dans le champ Couleur du tableau. Malheureusement, le moteur de base de données Access ne prend pas en charge l'agrégat Count (Distinct). Pour renvoyer cette valeur d'une table Access, vous devez utiliser une sous-requête telle que:

SELECT Count(*) AS N
FROM 
(SELECT DISTINCT Color FROM tblColors) AS T;

Supposons maintenant que vous souhaitiez également inclure une autre valeur d'agrégat, telle qu'une Somme, et que vous souhaitiez regrouper certaines valeurs, dans ce cas, Couleur. Sur SQL Server, vous pouvez écrire cette requête en tant que:

SELECT Color, Sum(Value) AS Total, Count(Distinct Color) AS N
FROM tblColors
GROUP BY Color

Ceci fournit les résultats suivants:

Les données:

Color   Total   N
Blue    10      1
Green   8       1
Orange  1       1
Red     13      1

Maintenant, si vous demandez si cela doit ou non renvoyer la valeur '1', la réponse est oui. Si je comprends bien, le compte (Distinct) peut être utilisé comme test pour vérifier les résultats d’une requête donnée.

Si vos données se trouvent sur un serveur prenant en charge Count (Distinct), vous pourrez peut-être utiliser une requête directe pour extraire les résultats. Si vous travaillez avec des données Access, cela devient un peu plus difficile.

Puisque nous avons utilisé des sous-requêtes pour la requête précédente, nous devrons faire de même ici. L'astuce consiste toutefois à utiliser deux sous-requêtes, comme indiqué dans le code SQL suivant:

SELECT C.Color, Sum(C.Value) AS Total, T2.N
FROM
    (SELECT T.Color, Count(T.Color) AS N 
     FROM 
        (SELECT DISTINCT Color, Count(*) AS N 
         FROM tblColors GROUP BY Color) AS T 
    GROUP BY T.Color) AS T2 
INNER JOIN tblColors AS C
ON T2.Color = C.Color
GROUP BY C.Color, T2.N;
4

Cela fonctionne dans Access 2007 et 2010:

select format(sum(bpa_ext_price) /
              (select count(*) from (select distinct ord_num from sales)),
             "standard") AS Avg_Ord_Amt
from   sales
1
Steve Graessle