【问题标题】:Need to use COUNT inside WHERE/HAVING to return opened and closed需要在 WHERE/HAVING 中使用 COUNT 来返回打开和关闭
【发布时间】:2020-05-16 07:49:57
【问题描述】:

NumberWrittenByOperator
NumberRemovedByOperator

我在 MsAccess 中使用以下 SQL:

SELECT [TagRegister Query - All].ReportedBy AS WrittenBy,
       Count([TagRegister Query - All].ReportedBy) AS Written,
       Count([TagRegister Query - All].RemovedBy) AS Removed
FROM [TagRegister Query - All]
GROUP BY [TagRegister Query - All].ReportedBy, [TagRegister Query - All].RemovedBy;

我从表中创建了一个查询,这是从查询中查找数据。我正在尝试计算报告的异常数量 (ReportedBy/Written) 和移除的异常数量 (RemovedBy/Removed)。

假设操作员报告了 5 个异常 - 但他只移除了 1 个,机械师移除了 2 个,剩下的 2 个仍然“打开”。但有了这个我得到了

WrittenBy   Written  Removed 
Operator      1        1 
Operator      2        2 
Operator      2        0

我希望它返回更像这样的东西:

WrittenBy   Written  Removed  Ratio
Operator      5        1       20%

我想看看他写了多少,删除了多少,以及他的表现如何 - 删除他报告的异常

我可以进行查询以返回报告的异常数量,以及单独的查询以返回已删除的异常。我正在努力构建一个查询以在同一查询中返回两者。

你们能帮帮我吗?

我很乐意提供尽可能多的东西,对于 Stack Overflow 来说还是新手,请耐心等待。

图片显示了每个操作员写的数字,以及操作员删除的数字。所以一个人可以写异常,并让其他人关闭它。如果可能的话,我想显示他们写的数字,以及他们删除的数字。

感谢您的宝贵时间!

【问题讨论】:

  • 我不明白您是如何从示例数据中获得 5 个写入和 1 个删除的。确定要删除 3 个?
  • 我想看运营商写的数字,以及运营商删除的数字。对于这个报告,我只需要查看操作员写入和删除的内容,不需要包含机械师删除的内容。
  • 根据显示的数据,我们无法判断移除的两个单元应该被忽略。您的源查询不足以完成手头的任务。
  • 编辑问题添加一些示例数据和所需的结果会有所帮助。
  • 操作员名称将在 ReportedBy 列以及 RemovedBy 列中。有没有办法计算 RemovedBy 中的操作员名称与 ReportedBy 匹配的位置?

标签: sql ms-access select count where-clause


【解决方案1】:

首先将[TagRegister Query - All].RemovedBy列添加到查询的返回列中:

SELECT [TagRegister Query - All].ReportedBy AS WrittenBy,
       [TagRegister Query - All].RemovedBy,
       Count([TagRegister Query - All].ReportedBy) AS Written,
       Count([TagRegister Query - All].RemovedBy) AS Removed
FROM [TagRegister Query - All]
GROUP BY [TagRegister Query - All].ReportedBy, [TagRegister Query - All].RemovedBy;

然后像这样对该查询使用条件聚合:

SELECT t.WrittenBy,
  SUM(t.Written) AS Written,
  SUM(IIF(t.RemovedBy = t.WrittenBy, t.Written, 0)) AS Removed,
  ROUND(100.0 * Removed / Written, 2) & "%" AS Ratio
FROM (
    SELECT q.ReportedBy AS WrittenBy,
           q.RemovedBy,
           Count(q.ReportedBy) AS Written,
           Count(q.RemovedBy) AS Removed
    FROM [TagRegister Query - All] AS q
    GROUP BY q.ReportedBy, q.RemovedBy 
) AS t
GROUP BY t.WrittenBy

我使用别名使代码更短、更易读。

【讨论】:

  • 让我快速尝试一下!
  • 就是这样!完美的。非常感谢!
  • 最后一个问题。我需要在其中添加一个“圆形”子句才能没有 25.92384877520938475% 这一切都在哪里?
  • 如果您指的是比率,请查看我编辑的答案。将 2 更改为您需要的小数位数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多