Sql 在MS Access中,如何基于同一查询中的数据汇总数据?
我在MS Access中有一个与下表类似的表。我试图创建一个查询,将开销汇总到任务中,这样它看起来就像下面的第二个表Sql 在MS Access中,如何基于同一查询中的数据汇总数据?,sql,ms-access,Sql,Ms Access,我在MS Access中有一个与下表类似的表。我试图创建一个查询,将开销汇总到任务中,这样它看起来就像下面的第二个表 Quote Task Cost Total USD ========= ========== ==== ========= Quote-001 Task001 1.5 1.5 Quote-001 Task002 1.4 1.4 Quote-001 Task003
Quote Task Cost Total USD
========= ========== ==== =========
Quote-001 Task001 1.5 1.5
Quote-001 Task002 1.4 1.4
Quote-001 Task003 1.3 1.3
Quote-001 Task004 1.2 1.2
Quote-001 Overhead-A 10 10
Quote-001 Overhead-B 5 5
Quote-001 Overhead-B 2 2
-----------------------------------------
Total 22.4
下表列出了管理费用的总和10+5+2=17,除以四个任务4.25,再加上每个任务金额
Quote Task Cost Total USD
========= ========== ==== =========
Quote-001 Task001 5.75 5.75
Quote-001 Task002 5.65 5.65
Quote-001 Task003 5.55 5.55
Quote-001 Task004 5.45 5.45
-----------------------------------------
Total 22.4
甚至可以使用访问查询来实现这一点吗
提前感谢您的输入。请考虑聚合查询的派生表,这些查询汇总了管理费用并计算了任务项,每个任务项都由报价连接。然后在调整成本和总额字段时使用聚合 或者,在MS Access中,您可以将两个聚合查询保存为存储查询,并在最终查询中引用它们
SELECT t1.Quote, t1.Task,
t1.Cost + (t2.OverheadCost/t3.TaskCount) As NewCost,
t1.[Total USD] + (t2.OverheadCost/t3.TaskCount) As NewTotal
FROM (Overheads As t1
INNER JOIN qrySumOverHeadCost As t2 ON t1.Quote = t2.Quote)
INNER JOIN qryCountTaskItems As t3 ON t1.Quote = t3.Quote
WHERE t1.Task ALIKE '%Task%';
JET语法始终是一种冒险。如果是SQL Server,则可以将任务计数和开销总计存储在声明的变量中,但这里我们需要将它们存储在子查询中。另一个选项是在VBA模块中使用多个查询,这将更易于阅读,并且在大型集合中具有更好的性能
SELECT a.Quote,
a.Task,
ROUND(a.Cost + OverTot.Cost / aCount.Count,2) AS [Count],
ROUND(a.Total_USD + OverTot.Total_USD / aCount.Count,2) AS [Total_USD]
FROM
(
(
SELECT t.Quote,
t.Task,
SUM(t.Cost) AS [Cost],
SUM(t.Total_USD) AS [Total_USD]
FROM Table1 t
WHERE LEFT(t.Task,8) <> "OverHead"
GROUP BY t.Quote,
t.Task
) a
INNER JOIN
(
SELECT t.Quote,
SUM(t.Cost) AS [Cost],
SUM(t.Total_USD) AS [Total_USD]
FROM Table1 t
WHERE LEFT(t.Task,8) = "OverHead"
GROUP BY t.Quote,
LEFT(t.Task,8)
) OverTot ON a.Quote = OverTot.Quote
)
INNER JOIN
(
SELECT t.Quote,
COUNT(t.Task) AS [Count]
FROM Table1 t
WHERE LEFT(t.Task,8) <> "OverHead"
GROUP BY t.Quote
) aCount ON a.Quote = aCount.Quote
SELECT a.Quote,
a.Task,
ROUND(a.Cost + OverTot.Cost / aCount.Count,2) AS [Count],
ROUND(a.Total_USD + OverTot.Total_USD / aCount.Count,2) AS [Total_USD]
FROM
(
(
SELECT t.Quote,
t.Task,
SUM(t.Cost) AS [Cost],
SUM(t.Total_USD) AS [Total_USD]
FROM Table1 t
WHERE LEFT(t.Task,8) <> "OverHead"
GROUP BY t.Quote,
t.Task
) a
INNER JOIN
(
SELECT t.Quote,
SUM(t.Cost) AS [Cost],
SUM(t.Total_USD) AS [Total_USD]
FROM Table1 t
WHERE LEFT(t.Task,8) = "OverHead"
GROUP BY t.Quote,
LEFT(t.Task,8)
) OverTot ON a.Quote = OverTot.Quote
)
INNER JOIN
(
SELECT t.Quote,
COUNT(t.Task) AS [Count]
FROM Table1 t
WHERE LEFT(t.Task,8) <> "OverHead"
GROUP BY t.Quote
) aCount ON a.Quote = aCount.Quote