将两个查询合并为一个,GROUP BY 和 SUM 一个属性
Merge two queries in one, GROUP BY and SUM one attribute
我有一个管理项目及其资源(=员工)的数据库应用程序。我有一个概览,显示所有员工、他们分配到的项目以及他们分配到该项目的小时数。
概述由两个查询(记录集)组成,它们在 VBA-code 中放在一个循环中。
- 查询,第一个员工:
SELECT employeeID, employeeName, SUM(janPlan), First(janRest), ... , SUM(decPlan), FIRST(decRest)
FROM tblRessources
INNER JOIN tblEmployees ON employeeID = employeeID
GROUP BY employeeID, employeeName
它为每个员工循环。在每个循环中,员工的所有相应项目都在临时 table 中读取和写入。我使用以下查询:
- 查询,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, ...)
干杯!
我有一个管理项目及其资源(=员工)的数据库应用程序。我有一个概览,显示所有员工、他们分配到的项目以及他们分配到该项目的小时数。
概述由两个查询(记录集)组成,它们在 VBA-code 中放在一个循环中。
- 查询,第一个员工:
SELECT employeeID, employeeName, SUM(janPlan), First(janRest), ... , SUM(decPlan), FIRST(decRest) FROM tblRessources INNER JOIN tblEmployees ON employeeID = employeeID GROUP BY employeeID, employeeName
它为每个员工循环。在每个循环中,员工的所有相应项目都在临时 table 中读取和写入。我使用以下查询:
- 查询,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, ...)
干杯!