计算查询中的百分比 - Access SQL
Posted
技术标签:
【中文标题】计算查询中的百分比 - Access SQL【英文标题】:Calculate Percentages In Query - Access SQL 【发布时间】:2012-07-04 13:20:29 【问题描述】:我正在尝试量化一些事情。这是一个示例(当然是简化的):
tblParent: Number, Name
tblChild: Number, Name, ParentNumber, Criterion
我想计算具有相同 ParentNumber
的孩子的总数(很容易使用 Group By 和 Count(1) ),但问题是将该数字与具有相同 @ 的孩子的数量进行比较987654323@谁有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 的所有 Children 并将总数放入 Total
SELECT COUNT(1) AS Total FROM tblChild GROUP BY ParentNumber;
因此,我尝试使用该 TOTAL 计数并计算出有多少(以百分比表示)Criterion=1。但是由于它使用的是子查询,所以子查询不能返回多个 Total。我需要它来返回每个 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
...
【问题讨论】:
【参考方案1】:您的子查询没有 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 = 1
和0
来计算满足标准的记录。这使我可以同时获得每个ParentNumber
和Count(*)
的总数。
更新
您可能还想为没有孩子的父母获取结果。在这种情况下,您可以使用外连接
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
的记录总和为零。
【讨论】:
我喜欢这个.. 优雅且一键查询。 Remou 的回答也有效,但我认为出于我的目的(如果有效),这会更好。如果可行,您会看到一个复选标记。 这似乎有效。Criterion = X
可轻松编辑,易于阅读。谢谢!【参考方案2】:
如果您在 MS Access 中工作,您可以除以父母的 DCount。
Total/DCount("Parent","Table","Parent=" & Parent)
你也可以创建一个计数查询
SELECT Parent, Count(Parent) FROM Table GROUP BY Parent
然后将这两个查询添加到设计网格中,将它们连接到 Parent。
【讨论】:
我已经尝试在 Parent 上加入它们,但后来我遇到了 GROUP BY 的问题,并且无法在其中使用聚合函数...您能否为加入提供完整的 SQL ,我可能遗漏了一些简单的东西。 您是否创建并保存了每个查询?将查询而不是表格添加到设计窗口。 我从来都不擅长设计窗口,它是在 SQL 视图中完成的。我的 [TotalCountingQuery] 如上所述(当然保存了)。我会用我不成功的加入来修改我的帖子。 切换到设计视图,添加两个查询并将连接字段从一个拖到另一个。将为您创建 sql。 您认为我需要 3 个查询?好的..可以工作,因为连接查询中没有更多的聚合函数..让我试一试。以上是关于计算查询中的百分比 - Access SQL的主要内容,如果未能解决你的问题,请参考以下文章