首页 > 解决方案 > SQL 查询总计

问题描述

我正在尝试编写一个查询来计算几个项目的每位员工的平均利润。

我有一张表格,上面有员工姓名、他们正在从事的项目以及他们每天为特定项目带来多少利润。

我的第一个查询给出了 3 个字段 - 项目名称、员工为项目带来的所有利润的总和以及项目中的员工人数。

我的第二个查询我试图显示 2 个字段 - 项目名称和每个项目的每位员工的平均利润

SELECT SAYSquery.ProjectName, SUM(SAYSquery.Profit) AS SumOfProfit, Count(SAYSquery.[EmpFirstName]) AS NumberOfEmps
FROM SAYSquery
WHERE profit > 0
GROUP BY SAYSquery.ProjectName;
SELECT SAYSqueryNIPE.[ProjectName], SAYSqueryNIPE.[SumOfProfit]/[NumberOfEmps] AS total
FROM SAYSqueryNIPE
GROUP BY SAYSqueryNIPE.[ProjectName], SAYSqueryNIPE.[SumOfProfit]/[NumberOfEmps]; 

不幸的是,我的第二个查询给了我每个项目相同的平均利润,我不知道为什么。任何帮助将非常感激。

编辑:

查询 1 内容如下:

**Employee Name | Sell Rate | Renumeration | Profit (Sell-Renumeration) | Project Name**

查询 2 内容如下:

**PROJECT NAME | SumofProfit | NumberofEmployees**

Project X | $1500 | 3 employees

查询 3 内容如下:

**PROJECT NAME | TOTAL**

Project X | $500 (Average profit per employee)

标签: sql

解决方案


问题出在您计算员工人数的第一个查询中。如问题中所述,您返回的是行数,而不是参与该项目的员工。你需要使用count distinct. 我也建议不要指望EmpFirstName. 如果您有多个同名员工,则查询不会为您提供正确的结果。最好使用唯一的员工标识符而不是他们的名字。

SELECT SAYSquery.ProjectName, SUM(SAYSquery.Profit) AS SumOfProfit, 
       Count(distinct SAYSquery.[EmpFirstName]) AS NumberOfEmps
  FROM SAYSquery
 WHERE profit > 0
GROUP BY SAYSquery.ProjectName

如您的问题中所述,您可以将整个事情包装成一个查询,而不是两个或三个。

SELECT SAYSquery.ProjectName, SUM(SAYSquery.Profit)/Count(distinct SAYSquery.[EmpFirstName]) AS AvgProfitPerEmployee
  FROM SAYSquery
 WHERE profit > 0
GROUP BY SAYSquery.ProjectName

推荐阅读