2012-11-12 77 views
1

我有一个MS Access 2010中的表我试图分析属于各种群体完成各种工作的人。我想要做的是计算每个人每个团队完成的工作数量的标准偏差。意思是,我想要的结果是,对于每个组,我都会有一个数字,它构成了每个人做了多少工作的标准偏差。Microsoft Access SQL STDEV的数据计数

的数据结构是这样的:

OldGroup, OldPerson, JobID 

我知道,我需要做的集团和个人的作业ID的COUNT。我试图创建一个子查询的工作,但没有工作:

SELECT data.OldGroup, STDEV(
    SELECT COUNT(data.JobID) 
    FROM data 
    WHERE data.Classification = 1 
    GROUP BY data.OldGroup, data.OldPerson 
) 
FROM data 
GROUP BY data.OldGroup; 

这将返回一个错误“最多一个记录可以通过这个子查询返回,”我知道错了,因为当我试图要将子查询作为独立查询运行,它已成功返回多条记录。

问题: 我怎样才能得到一个COUNTSTDEV

问题:如果这个问题可以通过更正我的例子中不正确的语法来解决,请这样做。

+0

它告诉你,你只能返回一个项目(STDEV),但你是'GROUPING BY'。从子查询中删除“GROUP BY”,看看是否有效。 – Sablefoste

+0

@SableFoste,在删除子查询中的GROUP BY后,Access确实在物理上运行了查询,但输出肯定不是正确结果 - 它为每个记录返回一个记录,每个记录的计算都与'STDEV'。显然,不同的群体不应该有相同的标准偏差,所以很明显在那里出了问题。 – jdotjdot

回答

0

战略上的一个小变化不适用于所有情况,但最终为此工作结束工作似乎解决了这个问题。我没有在SELECT声明中粘贴子查询,而是将它放在FROM中,模仿创建一个单独的表。

这样,我的代码如下所示:

SELECT OldGroup, STDEV(NumberJobs) AS JobsStDev 
FROM (
    SELECT OldGroup, OldPerson, COUNT(JobID) AS NumberJobs 
    FROM data 
    WHERE data.Classification = 1 
    GROUP BY OldGroup, OldPerson 
) AS TempTable 
GROUP BY OldGroup; 

这似乎把工作做好。

0

尝试对“SELECT COUNT(data.JobID)....”执行最大表查询。“ 然后对于第二个查询,使用新的基本表。
有时在2个或更多查询中执行某些操作会更容易。

+0

这就是我现在所做的,但是因为我必须运行这些中的100个,所以我希望获得基于子查询的解决方案。由于这不幸的是在Access(它具有更多有限的SQL功能),所以我不可能轻易地拥有一堆临时表/变量。 – jdotjdot

+0

如果使用VBA编写此代码,则可以动态编写SQL以创建一个随机名称表,例如Guid。所以你要创建表,给它一个唯一的名字,以便其他代码/用户不会发生冲突,并在完成后删除表。 – MatthewMartin

+0

通常(像SQL Server一样),都可以直接在SQL中完成。使用Access有没有办法做到这一点,还是都必须在VBA?如果我不需要,我宁愿不碰VBA。 – jdotjdot

相关问题