但是,这个例子显示了在同一个表中除了系统操作符之外还有其他六个位置,我需要计算这个'Person‘在其他位置显示了多少次。
一个记录的'Person‘可以是系统操作员,而在另一个记录中'Person’可以是工程师。所以我想要一个查询,它能够计算这个人在同一个查询中是工程师或系统操作符的次数。
当我为Engineer添加一个Count()函数时,它只尝试返回一个人既是一个工程师又是一个系统操作符的值,并且我想要计算这个人清楚地出现了多少次。
抽样数据将包括以下内容:
最终,我需要生成一个报表,或者有一个带有人员列表(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"));发布于 2018-01-05 19:12:24
如果您的SUM (和其他字段)使用值1表示person是一个系统运算符,而使用0表示此人不是系统运算符,则可以使用[System Operator]函数而不是COUNT函数:
SELECT SUM(tblEventPersonnel.[System Operator]) AS [CountOfSystem Operator],
SUM(tblEventPersonnel.[Engineer One]) AS [CountOfEngineerOne]
FROM tblEventPersonnel但是,在您的例子中,这些字段存储人员。您可以在CASE WHEN函数中使用SUM使计数成为条件。如果表是规范化的,并且person的ID存储在这些字段中,则可以使用一个简单的> 0作为条件。但是您的表设计似乎没有规范化,因为您存储的是人名而不是ID。
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";发布于 2018-01-05 18:51:31
您可以使用子查询联合。
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") );
根据需要添加其他字段。
发布于 2018-01-05 18:52:28
我认为这张桌子的设计方式不适合你现在的使用。对我来说,使用支点可以更容易地可视化和查询数据。这里有一篇关于如何在sql server中有效地使用支点的伟大文章:
https://www.codeproject.com/Tips/500811/Simple-Way-To-Use-Pivot-In-SQL-Query
下面是关于堆栈溢出的另一个讨论:
Convert Rows to columns using 'Pivot' in SQL Server
由于您将此标记为MS Access和SQL Server,下面是另一个用户在MS中使用支点的体验:
https://stackoverflow.com/questions/48118926
复制相似问题