【问题标题】:SQL Help, Group by another tableSQL 帮助,按另一个表分组
【发布时间】:2017-04-17 22:48:01
【问题描述】:
select
  d.DepartmentId,
  d.Name,
  d.GroupName,
  eph.Rate * 40 * 52 * count(edh.EmployeeId) as AnnualPay
from
  HumanResources.Department d,
  HumanResources.EmployeePayHistory eph,
  HumanResources.Employee e,
  HumanResources.EmployeeDepartmentHistory edh
where
  e.CurrentFlag = 'True' and
  edh.DepartmentID = d.DepartmentID and
  edh.EmployeeID = eph.EmployeeID and
  e.EmployeeID = eph.EmployeeID
group by
  d.departmentID;

我们的目标是编写一份报告,以显示部门ID、姓名、组名在该部门工作的所有员工的年薪总额以及在该部门工作的员工人数。

要计算annual pay,请将每个员工的工资率乘以一年中 52 周的 40 小时

仅包括所有员工年薪总额超过half a million dollars 的部门。

所有员工都应该是最新的(使用 currentflag)。

按员工年薪总额降序排列报表。

表格都包括在内,我不知道如何按部门分组...Database

【问题讨论】:

  • 我有很多关于你的问题的问题。我将不得不将它们分成多个 cmets。这是第一个:(1)你确定这是 MySQL 吗?数据库图是为 AdventureWorks 准备的,通常是 SQL-Server 的东西。它可以移植到 MySQL,所以你可能是对的。根据提供的答案的复杂程度,它可能不会产生任何可能性。
  • 和其他人:(2)我不知道 AdventureWorks 的数据,但从图表上看,可能有员工没有每周领薪,但您的 * 52 似乎假设每个人都有薪水每周。 (3)虽然您正在处理使用CurrentFlag 离开的员工,但我认为您可能还需要处理在 EmployeeDepartmentHistory 中有多个条目的员工(已移动部门或换班的员工)和在 EmployeePayHistory 中有多个条目的员工(那些他们的工资发生了变化)。
  • 如果您关心问题 (2) 和 (3) 中的一个或两个,我建议您首先创建一个查询,该查询返回每个员工的正确当前数据,确保您没有有任何员工在那里两次。一旦到位,然后担心总结每个部门的所有薪水。
  • 一名员工可以同时属于多个部门吗?

标签: mysql sql


【解决方案1】:

如果我明白你在寻找什么,这应该可以:

SELECT 
    d.DepartmentId, 
    d.Name, 
    d.GroupName,
    SUM(eph.Rate * 40 * 52) as AnnualPay,
    Count(edh.EmployeeId) as EmployeeCount
from HumanResources.Department d 
JOIN HumanResources.EmployeeDepartmentHistory edh
ON edh.DepartmentID = d.DepartmentID
JOIN HumanResources.EmployeePayHistory eph
ON edh.EmployeeID = eph.EmployeeID
JOIN HumanResources.Employee e
ON e.EmployeeID = eph.EmployeeID
WHERE e.CurrentFlag = 'True' 
GROUP BY d.departmentID,d.Name,d.GroupName
HAVING AnnualPay > 500000
ORDER BY AnnualPay DESC;

【讨论】:

  • 正如最初发布的那样,由于SUM(eph.Rate * 40 * 52 * Count(edh.EmployeeId)) 行,这不会运行。你不能像这样嵌套聚合。另外,也没有必要。源数据涉及所有员工,当您对他们的个人工资求和时,您也不需要乘以有多少员工。
  • 我刚刚对我的代码做了一个小改动。这可能不是错误的原因,但如果它现在开始工作,那么请告诉我。
【解决方案2】:

请尝试以下...

SELECT DepartmentId AS DepartmentId,
       DepartmentName AS DepartmentName,
       DepartmentGroup AS DepartmentGroup,
       SUM( expectedAnnualPay ) AS TotalExpectedAnnualPay,
       COUNT( DepartmentId ) AS EmployeeCount
(
    SELECT Department.DepartmentId AS DepartmentId,
           Name AS DepartmentName,
           GroupName AS DepartmentGroup
           Rate *
               40 *
               52 AS expectedAnnualPay,
           EmployeeID AS EmployeeID
    FROM HumanResources.Department HRDepartment
    JOIN HumanResources.EmployeeDepartmentHistory HREmployeeDepartmentHistory ON HREmployeeDepartmentHistory.DepartmentID = HRDepartment.DepartmentID
    JOIN HumanResources.Employee HREmployee ON HREmployee.EmployeeID = HREmployeeDepartmentHistory.EmployeeID
    JOIN HumanResources.EmployeeDepartmentHistory HREmployeeDepartmentHistory ON HREmployee.EmployeeID = HREmployeePayHistory.EmployeeID
    WHERE HREmployee.CurrentFlag = 'True'
) departmentEmployee
GROUP BY DepartmentId
HAVING TotalExpectedAnnualPay > 500000
ORDER BY TotalExpectedAnnualPay DESC;

假设该部门内的所有现有员工都将留在该部门,您似乎要求提供该价值大于 500,000.00 美元的每个部门的总预期年薪金额列表以当前费率一年,并且在此期间不会添加任何员工。

我从以下查询(我给出了departmentEmployeeLevel 的别名)开始解决了这个问题...

SELECT Department.DepartmentId AS DepartmentId,
       Name AS DepartmentName,
       GroupName AS DepartmentGroup
       Rate *
           40 *
           52 AS expectedAnnualPay,
       EmployeeID AS EmployeeID
FROM HumanResources.Department HRDepartment
JOIN HumanResources.EmployeeDepartmentHistory HREmployeeDepartmentHistory ON HREmployeeDepartmentHistory.DepartmentID = HRDepartment.DepartmentID
JOIN HumanResources.Employee HREmployee ON HREmployee.EmployeeID = HREmployeeDepartmentHistory.EmployeeID
JOIN HumanResources.EmployeeDepartmentHistory HREmployeeDepartmentHistory ON HREmployee.EmployeeID = HREmployeePayHistory.EmployeeID
WHERE HREmployee.CurrentFlag = 'True'

此子查询返回每个部门的DepartmentId、部门NameGroupName,以及每个当前员工的EmployeeID 及其计算的预期年薪。

主查询使用子查询的结果将每个部门的结果聚合/组合在一起,并为每个部门计算预期年薪和员工人数的总和。然后,它使用HAVING 将列表细化为仅那些预期年工资成本大于 500,000.00 美元的部门,并按该字段对剩余记录进行排序。

如果您有任何问题或cmets,请随时发表评论。

【讨论】:

  • 消息 102,级别 15,状态 1,行号 12 '(' 附近的语法不正确。消息 102,级别 15,状态 1,行号 14 'eph' 附近的语法不正确。
  • 感谢您提供详细的错误消息。这确实有帮助。我已经更新了我的代码。请尝试修改后的代码。
  • select d.DepartmentID, d.Name, d.GroupName, sum(eph.Rate * 52 * 40) as TotalAnnualPay from HumanResources.Department d, HumanResources.EmployeePayHistory eph, HumanResources.EmployeeDepartmentHistory edh, HumanResources.Employee e where d.DepartmentID = edh.DepartmentID and eph.EmployeeID = edh.EmployeeID and e.EmployeeID = eph.EmployeeID and e.CurrentFlag = 'True' group by d.departmentId, d.name, d.groupname Having sum(eph.rate * 52 * 40) > 500000 Order by 4 desc;
  • 我想出了这段代码,它确实返回了一个看起来合理且正确的结果,但我不能确定,请给我你的意见。
  • 您不能删除外层查询并在总工资上使用HAVING 子句吗?另外,你在FROMs 失踪了吗?
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多