将两个查询合并为一个,GROUP BY 和 SUM 一个属性

Merge two queries in one, GROUP BY and SUM one attribute

我有一个管理项目及其资源(=员工)的数据库应用程序。我有一个概览,显示所有员工、他们分配到的项目以及他们分配到该项目的小时数。

概述由两个查询(记录集)组成,它们在 VBA-code 中放在一个循环中。

  1. 查询,第一个员工:
SELECT employeeID, employeeName, SUM(janPlan), First(janRest), ... , SUM(decPlan), FIRST(decRest) 
FROM tblRessources 
INNER JOIN tblEmployees ON employeeID = employeeID
GROUP BY employeeID, employeeName

它为每个员工循环。在每个循环中,员工的所有相应项目都在临时 table 中读取和写入。我使用以下查询:

  1. 查询,rstRessources
SELECT projectName, janPlan, janRest, ... , decPlan, decRest
FROM tblRessources
INNER JOIN tblProjects ON projectID = projectID
WHERE employeeID = rstEmployees(employeeID)

我想要的结果是一个连续的表格,如下所示:


此过程花费的时间太长(最多 30 秒),我只想使用 SQL 查询或数据透视表 table 来执行此操作。我想摆脱循环,因为这需要太多时间。只有 SQL 才有可能吗?您有什么想法可以实现吗?

更改基础 tables 是一种可能性,如果它有任何帮助的话。我也知道 tables 违反了原子性和所有好的规范化的东西,但它适用于我当前的解决方案。

感谢您的帮助!

我想你正在寻找这样的东西:

select r.level,case when r.level=0 then r.employeeName when r.level=1 then r.projectName end name,r.janPlan 
from 
(
    select 0 level,e.employeeID,e.employeeName,0 projectID,'' projectName,SUM(r.janPlan) janPlan
    from tblRessources r
    join tblEmployees e ON e.employeeID = r.employeeID
    group by e.employeeID,e.employeeName
    union all
    select 1 level,e.employeeID,e.employeeName,p.projectID,p.projectName,SUM(r.janPlan) janPlan
    from tblRessources r
    join tblEmployees e ON e.employeeID = r.employeeID
    join tblProjects p ON p.projectID = r.projectID
    group by e.employeeID,e.employeeName,p.projectID,p.projectName
) r
order by r.employeeName,r.projectName

结果如下所示:

iBener 给了我解决问题的决定性线索。我将他的 MYSQL-query 翻译成 access-SQL 并且这个有效:

SELECT employeeID, 
SWITCH(typ = 0, 'typ 0', typ = 1, 'typ 1') AS typSwitch, 
SWITCH(typ = 0, employeeName, typ = 1, projektName) AS employeeProjekt, rankName,
SumJanPlan, FJanRest

FROM( 
SELECT 0 AS typ, ma.employeeName, NULL AS projektName, ma.dKX, 
  ma.employeeName, ma.employeeName AS rankName,
  SUM(janPlan) AS SumJanPlan, FIRST(janRest) AS fJanRest
FROM tblEmployees AS ma LEFT JOIN tblRessourcs AS res ON ma.dKX = res.dKX
WHERE res.jahr = 2015
GROUP BY ma.employeeName, ma.dKX

UNION ALL

SELECT 1 AS typ, NULL AS employeeName, pro.projektName, res.dKX, 
  ma.employeeName AS rankName, SUM(janPlan) AS SumJanPlan, FIRST(janRest) AS fJanRest
FROM tblProjekte AS pro 
  INNER JOIN (tblEmployees AS ma 
  INNER JOIN tblRessources AS res ON ma.employeeID = res.employeeID) ON pro.projektNr = res.projektNr

WHERE res.[jahr]=2015 AND res.employeeID IN (
  SELECT DISTINCT employeeID FROM tblRessources
  WHERE jahr = 2015) 
GROUP BY pro.projektName, ma.employeeName, res.dkx)

ORDER BY rankName, typ

备注

  • 我不得不添加一个额外的 nameRank 列,以便所有 员工按字母顺序显示。否则顺序是 由 employeeID 决定。
  • level 是 Access-SQL 中的保留字,所以我使用了 typ
  • 而不是 CASE WHEN 当你使用 SWITCH( IF, THEN, ESLE IF, THEN, ...)

干杯!