我认为我过于复杂了。
我在SQL上并不出色,所以我有时需要使用查询构建器。
我想要实现的目标:
我希望我的查询能够告诉我:
经理姓名
经理名称在表格中的次数
等于TRUE的争议数
争议除以经理的总时间在表中
当前SQL
SELECT DISTINCT tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager, Count(tbl_Quality_Disputes.Manager) AS CountOfManager, [Decision]/[Manager] AS Success_Rate
FROM tbl_Quality_Disputes
GROUP BY tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager, tbl_Quality_Disputes.Decision, [Decision]/[Manager]
HAVING (((tbl_Quality_Disputes.Decision)="Approved"));
我在哪里错了?
提前致谢
答案 0 :(得分:1)
让我们从您需要的分组开始。在您的搜索结果中,您需要为每位经理添加一行,以便明确表示没有Decision
。
然后,您没有将过滤放在WHERE
子句中的决策上,因为这样也会从计数(*)中删除行,但HAVING
是意味着聚合字段的条件,所以你也不能把它放在那里。由于您需要对其中一个聚合进行过滤而不对另一个进行过滤,因此您可以在聚合内部使用case
。
最后,成功率的计算应基于计数,而不是Manager
和Decision
字段。
我忽略了LoggedDate
字段,因为它的含义不明确,但如果你解释一下我会编辑我的查询以便它可以适合
SELECT Manager,
COUNT(*) AS CountOfManager,
SUM(case when Decision = "Approved" then 1 else 0 end) AS Decision,
SUM(case when Decision = "Approved" then 1 else 0 end) / Count(*) AS Success_Rate
FROM tbl_Quality_Disputes
GROUP BY Manager
作为旁注,我从所有字段前缀中删除了表名,因为当使用单个表时,不需要它并使查询更加冗长。使用两个或多个表时,最好在列名前加上前缀,但是您可以为表提供别名,使所有内容更紧凑。
修改强>
由于同一管理器的所有行的LoggedDate
都相同,您可以添加GROUP BY
或将其与MIN
或MAX
汇总(我更喜欢后一种选择,我发现它更强大)。
关于你得到的错误,可能是因为Access doesn't support the CASE
expression(对不起,没有人知道)。我将其替换为IIF
,现在它已经成功了。
SELECT Manager,
MAX(LoggedDate) AS MaxLoggedDate,
COUNT(*) AS CountOfManager,
SUM(IIF(Decision = "Approved", 1, 0)) AS CountOfDecision,
SUM(IIF(Decision = "Approved", 1, 0)) / Count(*) AS Success_Rate
FROM tbl_Quality_Disputes
GROUP BY Manager
答案 1 :(得分:0)
尝试使用以下查询,
SELECT tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager,
Count(tbl_Quality_Disputes.Manager) AS CountOfManager, [Decision]/[Manager] AS Success_Rate
FROM tbl_Quality_Disputes
WHERE tbl_Quality_Disputes.Decision="Approved"
GROUP BY tbl_Quality_Disputes.LoggedDate, tbl_Quality_Disputes.Manager,
tbl_Quality_Disputes.Decision, [Decision]/[Manager];
请提供样本数据和预期输出