使用SQL计算一个查询中一个表的多个列?

时间:2018-01-05 17:59:50

标签: sql sql-server ms-access

此示例显示了什么有效,但是,除了系统操作员在同一个表格中还有其他六个位置,我需要计算这个' Person'也显示在其他位置。

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

当我为 Engineer 添加Count()函数时,它只会尝试返回该人员同时是 Engineer System Operator <的值/ em>我想知道这个人要么明显多少次。

示例数据包括以下内容:

  • 表名:TblEventPersonnel _______________

  • 表格字段:开始日期,汽车,州,测试经理,系统操作员,工程师1,工程师2,实习生1,实习生2

  • 每个测试经理,系统操作员,工程师一,工程师二,实习生一,实习生二是一个“人”。说&#34; Bob&#34;

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

最终,我需要生成一个报告,或者有一个包含人员列表的组合框(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"));

4 个答案:

答案 0 :(得分:1)

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

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

但是,在您的情况下,这些字段会存储此人。您可以在CASE WHEN函数中使用SUM来使计数成为条件。如果表格已规范化并且人员的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";

答案 1 :(得分:0)

您可以使用子查询联合

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") );

根据需要添加其他字段。

答案 2 :(得分:0)

我认为桌子的设计方式对你目前的用途并不友好。对我来说,数据更容易使用数据透视表再次可视化和查询。这是一篇关于如何在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

答案 3 :(得分:0)

此代码有效!

delete()