Sql 计算注册经理的百分比
几周前我问了一个类似的问题,但现在要求已经改变了 考虑到下表: 我需要创建一个查询,返回属于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之前没有什么不同 有人看到这里出了什么问题吗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
非常感谢也许您需要为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。