【问题标题】:Get count on multiple columns from one table in one query using SQL?使用 SQL 在一个查询中从一个表中获取多个列的计数?
【发布时间】:2018-06-15 13:55:30
【问题描述】:

这个例子展示了什么是有效的,但是,除了 System Operator 在同一张表中还有六个其他职位,我还需要计算这个“Person”在其他职位上显示的次数.

一个记录的“人员”可以是系统操作员,而另一个记录的“人员”可以是工程师。所以我想要一个查询,它能够计算这个“人”在同一个查询中是工程师或系统操作员的次数。

当我为 Engineer 添加Count() 函数时,它只尝试返回该人既是 Engineer 又是 System Operator的值> 我正在计算这个人有多少次是明显的。

样本数据将包括以下内容:

  • 表名称:TblEventPersonnel _______________

  • 表格字段:开始日期、汽车、状态、测试经理、系统操作员、工程师一、工程师二、实习生一、实习生二

  • 每个测试经理、系统操作员、工程师一、工程师二、实习生一、实习生二都是“人”,比如“鲍勃”

  • 我需要一个查询,可以计算 Bob 是系统操作员、工程师一、工程师二、测试经理、实习生一、实习生二的次数。

最终,我需要生成一份报告或有一个包含人员(Bob、Joe、Gregg)或所有员工列表的组合框,当我选择一个人时,它会告诉我该人的次数在每个容量。下面的代码返回数字 4。

SELECT Count(tblEventPersonnel.[System Operator]) AS [CountOfSystem Operator]
FROM tblEventPersonnel
GROUP BY tblEventPersonnel.[System Operator]
HAVING (((tblEventPersonnel.[System Operator]) Like "Person"));

【问题讨论】:

  • 只是一个注释,但没有任何通配符或模式的LIKE= 完全一样,只是它需要更长的时间。
  • 您是否有能力更改数据库架构,因为此表设计偏离了数据库规范化的最佳实践?否则,您的查询将变得复杂、存储效率低、可扩展性有限。
  • 我确实有能力更改数据库架构。这是一个事件调度程序,我不知道如何组织这些表格。这是一个全新的数据库。我对任何想法持开放态度,但不确定最好的方法。

标签: sql sql-server ms-access


【解决方案1】:

如果您的 [System Operator](和其他字段)使用值 1 表示此人是系统操作员,使用值 0 表示此人是系统操作员,则您可以使用 SUM 函数代替 COUNT不是:

SELECT SUM(tblEventPersonnel.[System Operator]) AS [CountOfSystem Operator],
       SUM(tblEventPersonnel.[Engineer One]) AS [CountOfEngineerOne]
FROM tblEventPersonnel

但是,在您的情况下,这些字段存储人员。您可以在SUM 函数中使用CASE WHEN 来使计数成为条件。如果表已标准化并且人员的 ID 存储在这些字段中,则可以使用简单的 > 0 作为条件。但是您的表格设计似乎没有标准化,因为您存储的是人名而不是 ID。在这种情况下,您需要使用IS NOT NULL 作为条件:

SELECT SUM(CASE WHEN tblEventPersonnel.[System Operator] IS NOT NULL THEN 1 END) AS [CountOfSystem Operator],
       SUM(CASE WHEN tblEventPersonnel.[Engineer One] IS NOT NULL THEN 1 END) AS [CountOfEngineerOne]
FROM tblEventPersonnel
WHERE tblEventPersonnel.[System Operator] = "Bob"
   OR tblEventPersonnel.[Engineer One] = "Bob";

MS Access 不支持CASE WHEN,所以如果您使用的是MS Access,请改用IIF() 函数:

SELECT SUM(IIF(tblEventPersonnel.[System Operator] IS NOT NULL, 1, NULL)) AS [CountOfSystem Operator],
       SUM(IIF(tblEventPersonnel.[Engineer One] IS NOT, 1, NULL)) AS [CountOfEngineerOne]
FROM tblEventPersonnel
WHERE tblEventPersonnel.[System Operator] = "Bob"
   OR tblEventPersonnel.[Engineer One] = "Bob";

【讨论】:

  • 我尝试使用第三个,因为我在插入 VBA 之前将查询上传到 MS Access 查询的 SQL 视图中。这似乎运作良好,但不够准确。如果 Bob 在某一天是系统操作员,而在另一天是测试工程师,那么它会为系统操作员和测试工程师返回两个记录计数,而不是每个记录计数。如果 Bob 在同一天既是测试工程师又是系统操作员,那么它会返回其中一个,即正确答案。除了同一个人很可能不会在同一天处于两个不同的位置。
  • 这就是我们要求您提供样本数据的原因。从您的问题中很难猜出您的数据是什么样的。很高兴你最后弄明白了。
【解决方案2】:

您可以使用子查询联合

SELECT Count(CountofPerson) AS PositionCount FROM (SELECT Count(tblEventPersonnel.[System Operator]) AS [CountOfPerson] FROM tblEventPersonnel GROUP BY tblEventPersonnel.[System Operator] HAVING (tblEventPersonnel.[System Operator] Like "Person") UNION SELECT Count(tblEventPersonnel.[Engineer One]) AS [CountOfPerson] FROM tblEventPersonnel GROUP BY tblEventPersonnel.[Engineer One] HAVING (tblEventPersonnel.[Engineer One] Like "Person") );

根据需要添加其他字段。

【讨论】:

    【解决方案3】:

    我认为桌子的设计方式不适合您当前的使用。对我来说,数据会更容易使用数据透视表再次可视化和查询。这是一篇关于如何在 sql server 中有效使用 pivot 的好文章:

    https://www.codeproject.com/Tips/500811/Simple-Way-To-Use-Pivot-In-SQL-Query

    这是关于stackoverflow的另一个讨论:

    Convert Rows to columns using 'Pivot' in SQL Server

    由于您已将此标记为 MS Access 和 SQL Server,以下是另一位用户在 MS ACCESS 中使用数据透视的体验:

    Pivoting data in MS Access

    【讨论】:

      【解决方案4】:

      此代码有效!

      SELECT Sum(IIf(tblEventPersonnel.[System Operator]="Person",1,0)) AS [CountOfSystem Operator],
             Sum(IIf(tblEventPersonnel.[Test Engineer 1]="Person",1,0)) AS [CountOfTest Engineer 1]
      FROM tblEventPersonnel;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 2021-08-13
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多