首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL从一个查询中的一个表中获得多个列?

使用SQL从一个查询中的一个表中获得多个列?
EN

Stack Overflow用户
提问于 2018-01-05 17:59:50
回答 4查看 1.1K关注 0票数 0

但是,这个例子显示了在同一个表中除了系统操作符之外还有其他六个位置,我需要计算这个'Person‘在其他位置显示了多少次。

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

当我为Engineer添加一个Count()函数时,它只尝试返回一个人既是一个工程师又是一个系统操作符的值,并且我想要计算这个人清楚地出现了多少次。

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

  • 表名: TblEventPersonnel _______________
  • 表域:开始日期、汽车、状态、测试经理、系统操作员、工程师一、工程师二、实习生一、实习生二
  • 每个测试经理,系统操作员,工程师一,工程师二,实习生一,实习生二是一个“人”,说“鲍勃”
  • 我需要一个查询,可以计算出Bob多少次是系统操作员,工程师1,工程师2,测试经理,实习生1,受训人员2。

最终,我需要生成一个报表,或者有一个带有人员列表(Bob、Joe、Gregg)或所有员工的组合框的表单,当我选择一个人时,它会告诉我这个人在每个职位上有多少次。下面的代码返回数字4。

代码语言:javascript
复制
SELECT Count(tblEventPersonnel.[System Operator]) AS [CountOfSystem Operator]
FROM tblEventPersonnel
GROUP BY tblEventPersonnel.[System Operator]
HAVING (((tblEventPersonnel.[System Operator]) Like "Person"));
EN

回答 4

Stack Overflow用户

发布于 2018-01-05 19:12:24

如果您的SUM (和其他字段)使用值1表示person是一个系统运算符,而使用0表示此人不是系统运算符,则可以使用[System Operator]函数而不是COUNT函数:

代码语言:javascript
复制
SELECT SUM(tblEventPersonnel.[System Operator]) AS [CountOfSystem Operator],
       SUM(tblEventPersonnel.[Engineer One]) AS [CountOfEngineerOne]
FROM tblEventPersonnel

但是,在您的例子中,这些字段存储人员。您可以在CASE WHEN函数中使用SUM使计数成为条件。如果表是规范化的,并且person的ID存储在这些字段中,则可以使用一个简单的> 0作为条件。但是您的表设计似乎没有规范化,因为您存储的是人名而不是ID。

代码语言:javascript
复制
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()函数:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 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") );

根据需要添加其他字段。

票数 0
EN

Stack Overflow用户

发布于 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中使用支点的体验:

Pivoting data in MS Access

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48118926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档