【问题标题】:Calculating a field based on totals from queries in MS Access 2010根据 MS Access 2010 中的查询总计计算字段
【发布时间】:2014-03-13 00:34:46
【问题描述】:

第一次发帖。读者一段时间了。这个网站已经回答了我曾经遇到的每一个问题!但是,我遇到了一个我根本找不到答案的问题。

我是 Access 新手,但我在工作中的一个项目中做得很好。这是背景:

我们会向客户发送调查问卷,对与他们交谈的员工从 1 到 10 分进行评分。收到它们后,我将它们输入到一个名为 tblSurveys 的表中,其中包含与他们交谈的员工的 ID。还有另一个表,其中包含员工 ID、员工姓名和主管 ID。还有另一个表,其中包含 SupervisorID、主管的姓名和区域经理的 ID。最后一个表包括区域经理 ID 和区域经理的名称。然后它们在 Access 中关联。主键是每个组的 ID,调查有一个名为 SurveyID 的自动编号。

希望这一切都有意义。

我们对员工的评分方式基于调查结果:1-6 分是“贬低者”,计为 -1,9-10 分是“促进者”,计为 +1。我们将这些数字相加,然后除以调查总数。例如:

我得到 5 个调查结果:10、10、10、5、8。得分为 (3-1)/5 = 40%,因为有 3 个“推荐者”、1 个“批评者”,总共有5 次调查。很酷。

回到问题。

我正在尝试获取一个查询,该查询会生成每个员工及其各自分数的列表(根据上面的计算)。我想我可以简单地使用三个查询,一个查询每个员工有多少批评者,另一个查询每个员工的总发起人数量,另一个查询每个员工的调查总数。 我怎样才能创建一个查询,然后吐出该死的计算?我已经坚持了两天了。

一旦我开始工作,我需要做同样的事情,但每个主管都应用它,然后每个区域经理应用它。

然后我需要一份报告,该报告基本上列出了整个公司的总得分,然后是每个区域经理的得分,然后是每个主管的得分,然后是每个员工的得分。 (像嵌套)

我怎样才能做到这一点?

最好的问候, 大卫

【问题讨论】:

    标签: sql ms-access ms-access-2010


    【解决方案1】:

    尝试将多个查询用作单独的报告和数据源。

    假设您的表格如下所示...

    tblSurveys:

    employeeid    score
    ----------    -----
    1             10
    2             3
    2             2
    3             7
    
    etc...
    

    tblEmployees:

    employeeid    EmployeeName    SupervisorId    
    ----------    -------------   ------------    
    1             Employee 1      1               
    
    etc...
    

    tblSupervisors:

    SuperVisorId   SuperVisorName   RegManagerId
    ------------   --------------   -------------
    1              Super 1          1
    2              Super 2          1
    
    etc...
    

    tblRegManagers:

    RegManagerId    RegManagerName
    -------------   -----------------
    1               Regional Manager 1
    2               Regional Manager 2
    
    etc...
    

    您也许可以创建多用途查询。请参阅下面的 SQL...

    查询 1:这将为您提供员工统计信息

    select SupervisorName,RegManagerId,EmployeeName,
        Promoter,Detractor,surveys,Promoter-Detractor AS score,
        (Promoter-Detractor)/surveys as result 
        from 
        (       
        select a.EmployeeName,b.SupervisorName, b.RegManagerId,
        (select count(*) from tblSurveys where 
        employeeid=a.employeeid and score<7) as Detractor,
        (select count(*) from tblSurveys where 
        employeeid=a.employeeid and score>6)  as Promoter,
        (select count(*) from tblSurveys where employeeid=a.employeeid) as surveys 
        from tblEmployees a left join tblSupervisors b on a.supervisorid=b.supervisorid
        ) 
    

    Query2:这为您提供主管统计信息,但也使用员工统计信息 (Query1)

    select supervisorname,RegManagerId, 
        promotersum, detractorsum, surveyssum,(promotersum-detractorsum)/surveyssum 
        from 
        (select SuperVisorName,RegManagerId, sum(Promoter) as PromoterSum, 
        sum(Detractor) as DetractorSum, 
        sum(surveys) as surveyssum from query1 group by SuperVisorName,RegManagerId )
    

    Query3:这为您提供区域经理统计信息,但也使用主管统计信息 (Query2)

    select RegManagerName, promoter_cnt, detractor_cnt, survey_cnt, promoter_cnt-detractor_cnt as score, 
        (promoter_cnt-detractor_cnt)/survey_cnt as result 
        from 
        (select a.RegManagerName, b.RegManagerId, sum(b.promotersum) as promoter_cnt, 
        sum(b.detractorsum) as detractor_cnt, sum(b.surveyssum) as survey_cnt 
        from tblRegManagers a left join query2 b on a.RegManagerId=b.RegManagerId 
        group by a.RegManagerName, b.RegManagerId) 
    

    因此,虽然每个查询本身都用作报告,但前两个用作源查询。

    【讨论】:

    • 这就是我最初的想法:子查询。但我完全不确定如何使用它们。不过我会试试的。
    • 这太棒了!我让它工作得几乎完美。我唯一想问你的是关于RegionalManagerID。您在查询 1 上添加了它,但是我拥有实际表的方式有点不同:tblEmployees 没有 RegionManagerID。 tblSupervisors 是实际上将 RegionManagerID 作为第三列的那个。正因为如此,如何修改第一个 SQL 代码以包含从一开始的 RegionalManagerID?
    • 很高兴听到这对您有所帮助。在 Query1 上,将 a.RegManagerId 更改为 b.RegManagerId。试试看。另外,如果这有用,请投票给答案。
    • 我已经相应地修改了我的答案。
    • 就是这样。谢谢你,先生!!效果很棒!
    【解决方案2】:

    您似乎想多了这个问题 - 您可以在一个查询中完成整个推广者/批评者得分的事情。您需要一个聚合子查询,其中包含一个字段:Score:Sum(Choose([SurveyResult],-1,-1,-1,-1,-1,-1,0,0,1,1))/Count(*)。将EmployeeID 字段添加到Group By

    由于选择基于输入整数返回一个值(在我的示例中,然后求和),因此非常适合这种情况。只需除以调查结果的数量 (Count(*)) 即可获得分数。

    将其保存在自己的查询中,然后将其用作主查询中的子查询,加入 EmployeeID

    【讨论】:

    • 非常有趣的方法。我明天一定会试试的。我会带着结果回来的。
    • 我是 Access 和 SQL 的新手。如果我们使用其他响应中看到的表格,代码会是什么?
    猜你喜欢
    • 2017-04-28
    • 2023-03-07
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多