web-dev-qa-db-ja.com

Access 2007 SQLのGroup By集計関数で異なるものをカウントする

こんにちは私はしばらくフォーラムを閲覧しており、ここで最初の質問をしています。少し困っていますが、何か助けが得られるかどうか疑問に思っていました。私はAccess 2007を使用していますが、ネット上の質問に対する適切な回答はまだ見つかりません。

私のデータは診断コードとCustomerIDであり、私が探しているのは、各診断コードのCustomerIDの個別のカウントを見つける理由です。理想的には、Access以外のSQLでは次のようになります。

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

私はこれがかなり単純な質問であることを知っていますが、私が見つけている答えは複雑すぎる(複数の集約関数)か単純すぎるかのどちらかです。ここに私がそれを解決するために作ったアプローチがありますが、これはあまりにも多くの結果を返しています:

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

私が私の最初の投稿を言ったように私がここではっきりしていることを願っています、どんな助けも感謝されます。

4
Thescanswer

私はMS Accessの専門家ではありませんし、前回何かを書いたのはかなり長いですが、これでうまくいくかもしれません。

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

同じ質問があり、Microsoftのアクセスチームによるリンク(現在は機能していません)が見つかりました。これを実現する方法の素晴らしい実例があります。これも以下に含めます。


データ:

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

テーブル内の一意の色の数を取得するには、次のようなクエリを作成します。

SELECT Count(Distinct Color) AS N FROM tblColors

テーブルの[色]フィールドには4つの一意の色があるため、これは値4を返します。残念ながら、AccessデータベースエンジンはCount(Distinct)集計をサポートしていません。 Accessテーブルからこの値を返すには、次のようなサブクエリを使用する必要があります。

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

次に、Sumなどの別の集計値も含めて、ある値(この場合はColor)でグループ化するとします。 SQL Serverでは、このクエリは次のように記述できます。

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

これにより、次の結果が得られます。

データ:

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

これで、これが「1」の値を返すかどうかを尋ねている場合、答えは「はい」です。私が理解しているように、ここのCount(Distinct)は、特定のクエリの結果を検証するためのテストとして使用できます。

データがCount(Distinct)をサポートするサーバー上にある場合、パススルークエリを使用して結果を取得できる場合があります。 Accessデータを使用している場合、これは少し難しくなります。

前のクエリではサブクエリを使用したので、ここでも同じことを行う必要があります。ただし、トリックは、次のSQLに示すように2つのサブクエリを使用する必要があることです。

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

これはAccess 2007および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