Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算注册经理的百分比_Sql_Ms Access_Ms Access 2007 - Fatal编程技术网

Sql 计算注册经理的百分比

Sql 计算注册经理的百分比,sql,ms-access,ms-access-2007,Sql,Ms Access,Ms Access 2007,几周前我问了一个类似的问题,但现在要求已经改变了 考虑到下表: 我需要创建一个查询,返回属于managers Titles.IsManager的员工以及在Certified字段employees.Certified中有日期的员工的百分比。结果需要按每个存储所在的组进行分组 到目前为止,我有: SELECT d.GroupId, Sum(d.cert_complete) AS SumOfcert_complete, Count(d.cert_complete) A

几周前我问了一个类似的问题,但现在要求已经改变了

考虑到下表:

我需要创建一个查询,返回属于managers Titles.IsManager的员工以及在Certified字段employees.Certified中有日期的员工的百分比。结果需要按每个存储所在的组进行分组

到目前为止,我有:

SELECT d.GroupId, Sum(d.cert_complete) AS SumOfcert_complete, Count(d.cert_complete) AS CountOfcert_complete FROM (SELECT DISTINCT s.GroupId, e.EmployeeID, IIf(e.Certified Is Null,0,1) AS cert_complete FROM ((Stores AS s INNER JOIN EmployeeStores AS es ON s.StoreId = es.StoreId) INNER JOIN Employees AS e ON es.EmployeeId = e.EmployeeID) INNER JOIN Titles AS t ON e.TitleId = t.TitleId ) AS d WHERE t.IsManager GROUP BY d.GroupId; 然后这个

SELECT q.GroupId, (SumOfcert_complete/CountOfcert_complete)*100 AS percent_certified, Groups.GroupName FROM qryGroupCert_base AS q INNER JOIN Groups ON q.GroupId = Groups.GroupId; 您可以在我添加标题表的第一个查询中看到

1我得到提示输入iManager,尽管我不知道为什么 2返回的结果与我添加iManager之前没有什么不同

有人看到这里出了什么问题吗


非常感谢

也许您需要为t.IsManager提供一个标准,例如t.IsManager=TRUE。如果where子句没有将其设置为等于的值,Access可能不会将其解析为实际列,而是认为它是一个查询参数。

在第一个查询中,您有一个子查询,其中包括别名为t的标题:

(SELECT DISTINCT
    s.GroupId,
    e.EmployeeID,
    IIf(e.Certified Is Null,0,1) AS cert_complete
FROM
    ((Stores AS s
    INNER JOIN EmployeeStores AS es ON s.StoreId = es.StoreId)
    INNER JOIN Employees AS e ON es.EmployeeId = e.EmployeeID)
    INNER JOIN Titles AS t ON e.TitleId = t.TitleId
)  AS d
然后,在定义了子查询之后,就有了WHERE子句:

WHERE t.IsManager
问题是t alias和IsManager列只存在于子查询->外部父查询不知道它们。当Access数据库引擎遇到它无法识别为对象名、函数、文本值或SQL关键字的内容时,它会认为该内容必须是一个参数。。。因此,会弹出输入框,要求您为IsManager参数提供一个值

我认为应该将WHERE子句移动到子查询定义中

SELECT d.GroupId, 
       Sum(d.cert_complete) AS SumOfcert_complete, 
       Count(d.cert_complete) AS CountOfcert_complete
FROM [SELECT DISTINCT
        s.GroupId,
        e.EmployeeID,
        IIf(e.Certified Is Null,0,1) AS cert_complete
    FROM
        ((Stores AS s
        INNER JOIN EmployeeStores AS es ON s.StoreId = es.StoreId)
        INNER JOIN Employees AS e ON es.EmployeeId = e.EmployeeID)
        INNER JOIN Titles AS t ON e.TitleId = t.TitleId
        WHERE t.IsManager = True
    ]. AS d
GROUP BY d.GroupId;

WHERE子句用于布尔字段,因此WHERE IsManager与WHERE IsManager=1相同。问题是,即使添加了Titles表和WHERE子句,结果也没有改变。所以我不认为这个查询是关于标题联接的,但是我不知道为什么你不是说IsManager=-1在哪里?Access/Jet/ACE/VBA中布尔值TRUE的值为-1,而不是1。这就是说,尽管Access/Jet/ACE将理解您对布尔值的测试,在我回答这个问题之前,我不知道这一点,但我仍然认为您应该明确指定比较值,即IsManager=True。它只是更容易理解和阅读。对我来说,有趣的是Access QBE网格的设计视图将IsManager在网格的Criteria行中的位置表示为False。