问题描述
我员工的 IT 部门拒绝为我安装 R(声称开源版本存在安全风险),我尝试使用 Microsoft Access 2010 创建报告。
我在医院病房的简单表上创建查询时遇到困难(目的是跟踪数据收集练习):
我没有设法为每个病房分配一个与其床位容量成正比的样本量(上面的第三列),因为我无法参考“bedCapacity”列中元素的总和。使用 Excel,我会尝试这样的操作:
Excel 中的单元格 D2 根据公式包含 =INT(C2/SUM(C$2:C$6)*50)+1
和单元格 D3 到 D6。
有什么方法可以参考 Access 2010 中 bedCapacity
列中的总和?我尝试创建一个单独的查询来总结“bedCapacity”列,但是无法弄清楚如何引用该查询中的值。
我正在尝试使用 Access 2010,因此我可以为数据收集器的进度创建标准化报告(这在 Excel 2010 中不容易实现,因为它需要太多的手动操作 - 我尝试了数据透视表等)。
如有任何见解,我们将不胜感激。
解决方法
创建并保存此查询,以便为您提供所有病房的总床位容量。
SELECT Sum(bedCapacity) AS TotalBeds
FROM YourTable;
当然,将 YourTable 替换为您的表的名称。对于这个答案的其余部分,我将假设您使用名称 qryGrandTotalBedCapacity 保存了该查询。
然后你可以在另一个你的表中使用该查询cross join。交叉联接为您提供一个结果集,该结果集将一个数据源的每一行与另一个数据源的每一行配对。
但是,由于 qryGrandTotalBedCapacity 仅返回单行,这相当于使 TotalBeds
值可用于 YourTable 的每一行。而且,从这个起点开始,很容易将您的 Excel 公式转换为等效的 Access SQL。
SELECT
y.ID,y.ward,y.bedCapacity,(INT((y.bedCapacity/q.TotalBeds) * 50) + 1) AS sampleSize
FROM YourTable AS y,qryGrandTotalBedCapacity AS q;
,
我的 RoundSum 函数会做到这一点:
Public Sub ListSampleSizes(ByVal BedCapacity As Variant,ByVal SampleSum As Long)
Dim SampleSizes As Variant
Dim Item As Long
SampleSizes = RoundSum(BedCapacity,SampleSum)
For Item = LBound(SampleSizes) To UBound(SampleSizes)
Debug.Print Item + 1,BedCapacity(Item),SampleSizes(Item)
Next
End Sub
结果:
1 22 12
2 18 10
3 20 11
4 16 9
5 19 11
此处发布的代码太多,但完整代码可在 GitHub 下载:VBA.Round