アクセス-異なる列値に基づいて行の個別のカウントを取得します

ms-access
アクセス-異なる列値に基づいて行の個別のカウントを取得します

次の形式のアクセスデータベースがあります。

ID  | Period  | Data
---------------------
13  | 1       | xxxxx
13  | 2       | xxxxx
25  | 1       | xxxxx
25  | 2       | xxxxx
25  | 3       | xxxxx
52  | 1       | xxxxx
52  | 3       | xxxxx
94  | 1       | xxxxx
94  | 2       | xxxxx
94  | 3       | xxxxx

期間は1、2、または3です。 期間が1、2、3、または期間1と2、または1と3(常に期間1)のIDのカウントを取得する必要があります。 このようなクエリを実行するにはどうすればよいですか-異なる順列にヒットするのは3つの異なるクエリです。 結果は次のようになります。

  • 期間1、2、および3: * * カウント:2 *(ID 25および94の場合、必ずしもIDを返す必要はありませんが、カウントのみ)

  • 期間1および2: * * カウント:1(ID 13) *

  • 期間1および3: * * カウント:1(ID 52) *

これはAccessで可能ですか? まったく異なる値ではないため、https://stackoverflow.com/questions/857872/running-count-of-distinct-values-in-access [この質問]とhttp://blogs.office.com/b/ microsoft-access / archive / 2007/09/19 / writing-a-count-distinct-query-in-access.aspx [リンクされた記事]は十分なヘルプを提供していないようです。 私はまだデータベースを持っていないため、そのクエリをテストできませんが、テーブルを作成する前にそれが可能かどうか、または別のソリューションを見つける必要があるかどうかを知りたいです。

  2  0


ベストアンサー

このような変換クエリを作成して保存する最も簡単な方法

TRANSFORM Count(YourTable.ID) AS CountOfID
SELECT YourTable.ID
FROM YourTable
GROUP BY YourTable.ID
PIVOT YourTable.Period)

どの出力

ID  1 2 3
--  - - -
13  1 1
25  1 1 1
52  1   1
94  1 1 1

その後、それを使用して別のクエリを作成できます

SELECT t.Groups, Count(t.ID) AS CountOfID
FROM (SELECT ID,
     SWITCH(
               [1] = 1 and [2] =1 and [3] = 1, 'Periods 1, 2, and 3',
               [1] = 1 and [2] =1 , 'Periods 1 and 2',
               [1] = 1 and [3] =1 , 'Periods 1 and 3'
               )  as Groups

FROM TheSavedTransformQuery)  AS t
GROUP BY t.Groups;

これはこれを出力します

Groups              CountOfID
------------------- ---------
Periods 1 and 2        1
Periods 1 and 3        1
Periods 1, 2, and 3    2

単一のSQLステートメントとして実行する場合、これも機能します

SELECT
    t.Groups,
    Count(t.ID) AS CountOfID
FROM (

    SELECT
        Switch(
            FirstPeriod.Period=1 And [SecondPeriod.Period ]=2 And [ThirdPeriod.Period]=3,'Periods 1, 2, and 3',
            FirstPeriod.Period=1 And [SecondPeriod.Period]=2,'Periods 1 and 2',
            FirstPeriod.Period=1 And [ThirdPeriod.Period]=3,'Periods 1 and 3') AS Groups,
            DistinctID.ID
    FROM (((SELECT DISTINCT ID
        FROM
        YourTable )  AS DistinctID

        LEFT JOIN (SELECT ID, PERIOD
        FROM YourTable
        WHERE Period = 1)  AS FirstPeriod

        ON DistinctID.ID = FirstPeriod.ID)

        LEFT JOIN (SELECT ID, PERIOD
        FROM YourTable  WHERE Period = 2)  AS SecondPeriod
        ON DistinctID.ID = SecondPeriod.ID)

        LEFT JOIN (SELECT ID, PERIOD
        FROM YourTable
        WHERE Period = 3)  AS ThirdPeriod
        ON DistinctID.ID = ThirdPeriod.ID

)AS t
GROUP BY
    t.Groups

1


タイトルとURLをコピーしました