2012-07-04 84 views
1

我試圖量化一些東西。這裏是(簡化當然)樣本:計算查詢中的百分比 - 訪問SQL

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

我想指望孩子具有相同ParentNumber總數(方便使用GROUP BY和一個Count(1)),但問題比較該數字與ParentNumber的的子女人數相同。

這是我到目前爲止有:

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; 

所以我嘗試使用總數和找出有多少(作爲百分比)具有標準= 1。但是由於它使用的是子查詢,所以子查詢不能返回多個Total。我需要它返回每個ParentNumber的總數,用於具有該ParentNumber的每個Child的Percentage calc。

最終結果應該是:

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 

我有幾個這些查詢我的工會在一份報告中,產生一份完整的報告,由家長進行分組,顯示所有的家長都「的標準= 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 ...

回答

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子句。相反,我正在計數符合標準的記錄,總計1Criterion = 10。這使我可以在Count(*)的同時獲得每ParentNumber的總數。


UPDATE

你可能想要得到,沒有孩子以及家長的結果。在這種情況下,你可以使用一個外部聯接

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(*)也要算沒有孩子的記錄,以及在這種情況下,產生1。然而,在計算百分比時,爲了避免被零除,我除以Count(*)。在這種情況下結果仍然正確,因爲Criterion = 1的記錄總和將爲零。

+0

這我喜歡..優雅和一個查詢。 Remou的答案也適用,但我認爲對於我的目的(如果有效),這樣做會更好。你會看到一個複選標記,如果這個工程。 – StuckAtWork

+0

這似乎工作。對於Criterion = X,它很容易編輯,易於閱讀。謝謝! – StuckAtWork

1

如果您在MS Access中工作,則可以用父母的DCount進行劃分。

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

您還可以創建一個數查詢

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

然後兩個查詢添加到設計網格上的家長加入他們。

+0

我已經試過在Parent上加入它們,但後來遇到GROUP BY的問題,無法在其中使用集合函數......您可能會爲連接提供完整的SQL,可能會丟失簡單一些。 – StuckAtWork

+0

您是否創建了每個查詢並保存了它?將查詢添加到設計窗口中,而不是表格。 – Fionnuala

+0

我從來沒有對設計窗口很好,它是在SQL視圖中完成的。我有我的[TotalCountingQuery]如上(當然保存)。我會用我沒有成功的加入來修改我的帖子。 – StuckAtWork