1

私はいくつかのことを定量化しようとしています。これがサンプルです(もちろん簡略化されています):

tblParent: { Number, Name }
tblChild: { Number, Name, ParentNumber, Criterion }

同じ子の総数を数えたいのですがParentNumber(Group ByとCount(1)を使用すると簡単です)、問題はその数を同じ子の数と比較することParentNumberですCriterion = "Something"

これが私がこれまでに持っているものです:

SELECT "Criterion = 1" AS CritDesc,
COUNT(1) AS Total,
ParentNumber AS Parent,
( COUNT(1) / (SELECT Total FROM [TotalCountingQuery]) ) AS Percentage
FROM tblChild
WHERE Criterion = 1
GROUP BY ParentNumber;

[TotalCountingQuery]単純に、各ParentNumberを持つすべての子をカウントし、その合計をTotal

SELECT COUNT(1) AS Total FROM tblChild GROUP BY ParentNumber;

そのため、そのTOTALカウントを使用して、Criterion = 1の数(パーセンテージ)を計算しようとしています。ただし、サブクエリを使用しているため、サブクエリは複数の合計を返すことはできません。各ParentNumberの合計を返す必要があります。これは、そのParentNumberを持つ各子のパーセンテージ計算で使用されます。

最終結果は次のようになります。

CritDesc   |    Total    |   Parent    |   Percentage
```````````````````````````````````````````````````````
Criterion=1|      2      |   45011     |      0.333    // Means there should be 6 Children with 45011 as parent
Criterion=1|      4      |   43255     |       0.9
Criterion=1|      1      |   59056     |      0.44

これらのクエリのいくつかをレポートにまとめて、親ごとにグループ化された完全なレポートを作成し、すべての親のすべての「Criterion=X」を表示します。それは機能しています、私は上記の機能が必要です。

アイデア?

編集:この目的のための参加の私の試み:

SELECT "Criterion=1" AS CritDesc,
COUNT(c.Number) AS Total,
ParentNumber AS Parent,
COUNT(c.Number)/q.Total AS Percentage
FROM tblChild AS c INNER JOIN tblParent AS q ON c.ParentNumber = q.Number
GROUP BY ParentNumber

これはスローします:You tried to execute a query ... 'Count(1)/q.Total' as part of an aggregate function。それをgroup-byステートメントに追加するとCannot have aggregate function in GROUP BY...がスローされます。

4

2 に答える 2

5

サブクエリにはwhere句がないため、すべてのレコードがカウントされますが、サブクエリなしで実行できます。

SELECT
    "Criterion = 1" AS CritDesc,
    SUM(IIf(Criterion = 1, 1, 0)) AS NumCrit,
    COUNT(*) AS TotalNum,
    SUM(IIf(Criterion = 1, 1, 0)) / COUNT(*) AS Percentage,
    ParentNumber AS Parent
FROM
    tblChild
GROUP BY
    ParentNumber;

注:WHERE句を削除しました。代わりに、私は、その他の方法で合計することにより、基準を満たすレコードをカウントしてい1ます。これにより、。と同時にあたりの総数を取得できます。Criterion = 10ParentNumberCount(*)


アップデート

子供がいない親についても結果を取得することをお勧めします。その場合、外部結合を使用できます

SELECT
    "Criterion = 1" AS CritDesc,
    SUM(IIf(C.Criterion = 1, 1, 0)) AS NumCrit,
    COUNT(C.Number) AS TotalNumOfChildren,
    SUM(IIf(C.Criterion = 1, 1, 0)) / COUNT(*) AS Percentage,
    P.Number AS Parent
FROM
    tblChild AS C
    LEFT JOIN tblParent AS P
        ON C.ParentNumber = P.Number  
GROUP BY
    P.Number;

子のないレコードもカウントし、その場合は降伏するCount(C.Number)ので、子の総数を取得することに注意してください。ただし、パーセンテージの計算では、ゼロによる除算を避けるために除算します。その場合でも、レコードの合計がゼロになるため、結果は正しくなります。Count(*)1Count(*)Criterion = 1

于 2012-07-04T13:42:11.443 に答える
1

MS Access内で作業している場合は、親のDCountで割ることができます。

Total/DCount("Parent","Table","Parent=" & Parent)

カウントクエリを作成することもできます

SELECT Parent, Count(Parent) FROM Table GROUP BY Parent

次に、両方のクエリをデザイングリッドに追加して、それらを親に結合します。

于 2012-07-04T13:25:12.117 に答える