【问题标题】:Getting Percentages In Access获取访问百分比
【发布时间】:2013-09-10 15:00:31
【问题描述】:

我有一份报告列出了在调查中回答特定问题的员工人数,并列出了总人数。我试图获得答案占总人口的百分比,但我无法让代码正常工作。到目前为止,我的代码是:

SELECT 
Mgmt_Lvl.MGMT_LVL, 
Count(O896IA_VEMPPRSA.SYS_EMP_ID_NR) AS Total, 
Sum(IIf(emp_rlc_ir="Y",1,0)) AS Relocate, 
Sum(IIf(emp_int_asn_ir="Y",1,0)) AS International_Assignment, 
Sum(IIf(emp_tvl_ir="y",1,0)) AS Travel, 
Sum(IIf(emp_spc_asn_ir="y",1,0)) AS Special_Assignment
FROM (O867IA_VPJOBCO 
INNER JOIN Mgmt_Lvl ON O867IA_VPJOBCO.JOB_GRP_CD = Mgmt_Lvl.JOB_GRP_CD) 
INNER JOIN (O896IA_VEMPPRSA INNER JOIN O867IA_VCAREER 
    ON O896IA_VEMPPRSA.SYS_EMP_ID_NR = O867IA_VCAREER.SYS_EMP_ID_NR) 
ON O867IA_VPJOBCO.JOB_CLS_CD = O896IA_VEMPPRSA.JOB_CLS_CD
WHERE (((O896IA_VEMPPRSA.EMP_EMT_STS_CD)<>"T"))
GROUP BY Mgmt_Lvl.MGMT_LVL;

SUM(IIF(... 是计数,TOTAL 是总人口。我需要得到 SUM(IIF( / TOTAL 才能得到百分比。

【问题讨论】:

  • 您能解释一下您所说的“麻烦”是什么意思吗?它是抛出错误还是只是给你错误的数字?如果有帮助,您还可以编辑您的帖子并举例说明。
  • 另外,假设您提供给我们的查询正常工作,最简单的方法是计算将其用作数据源的新查询中的百分比。

标签: sql ms-access


【解决方案1】:

假设您的查询正在运行...将其包装在子查询中。

SELECT MGMT_LVL,
       R / TTL AS RelocatePercent,
       I / TTL AS IntlAssgntPercent,
       T / TTL AS TravelPercent,
       S / TTL AS SpecialAssgntPercent
FROM (SELECT Mgmt_Lvl.MGMT_LVL, 
             Count(O896IA_VEMPPRSA.SYS_EMP_ID_NR) AS TTL, 
             Sum(IIf(emp_rlc_ir="Y",1,0)) AS R, 
             Sum(IIf(emp_int_asn_ir="Y",1,0)) AS I, 
             Sum(IIf(emp_tvl_ir="y",1,0)) AS T, 
             Sum(IIf(emp_spc_asn_ir="y",1,0)) AS S
        FROM (O867IA_VPJOBCO 
                INNER JOIN Mgmt_Lvl
                   ON O867IA_VPJOBCO.JOB_GRP_CD = Mgmt_Lvl.JOB_GRP_CD) 
                INNER JOIN (O896IA_VEMPPRSA INNER JOIN O867IA_VCAREER 
                                               ON O896IA_VEMPPRSA.SYS_EMP_ID_NR = 
                                                  O867IA_VCAREER.SYS_EMP_ID_NR) 
                   ON O867IA_VPJOBCO.JOB_CLS_CD = O896IA_VEMPPRSA.JOB_CLS_CD
       WHERE (((O896IA_VEMPPRSA.EMP_EMT_STS_CD)<>"T"))
    GROUP BY Mgmt_Lvl.MGMT_LVL) SQ;

【讨论】:

  • 效果很好,谢谢。有没有办法让它只显示到小数点后 2 位?
  • 我建议使用报表或表单控件的格式属性,您将在其中显示数据:#.##。您也可以在查询中使用Round() 函数,但这会降低效率。
  • 另外,没有必要为此使用子查询。 Access(即 Jet/ACE db 引擎)完全能够使用别名字段名称作为另一个计算字段的一部分。我希望子查询方法会损害大型数据集的性能。
  • 你的假设是不正确的 mwolfe02 只是为了确保我用这两种方法对一个有 160 万条记录的记录集进行了测试。在多个测试中,以各种顺序运行 - 子查询比别名字段至少快一秒。为了让您了解我的具体数字 - 别名字段的平均时间是 10.21094 秒,而子查询的平均时间是 8.976563。在别名字段的情况下 - Access 在后台运行自己的子查询。
  • 我承认我有点惊讶差异如此显着(并且朝那个方向)。我想看看 JETSHOWPLAN 试图找出原因,但我今天不打算这样做。将来我一定会记住的。
【解决方案2】:

您可以在 Access 中的 SELECT 查询的其他计算字段中使用别名字段名称。以下修改后的 SELECT 子句应该可以满足您的要求:

SELECT 
Mgmt_Lvl.MGMT_LVL, 
Count(O896IA_VEMPPRSA.SYS_EMP_ID_NR) AS Total, 
Sum(IIf(emp_rlc_ir="Y",1,0))/Total AS Relocate, 
Sum(IIf(emp_int_asn_ir="Y",1,0))/Total AS International_Assignment, 
Sum(IIf(emp_tvl_ir="y",1,0))/Total AS Travel, 
Sum(IIf(emp_spc_asn_ir="y",1,0))/Total AS Special_Assignment

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多