此示例显示了什么有效,但是,除了系统操作员在同一个表格中还有其他六个位置,我需要计算这个' 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"));
答案 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中使用数据透视的体验:
答案 3 :(得分:0)
此代码有效!
delete()