Sql 在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

我在MS Access中有一个与下表类似的表。我试图创建一个查询,将开销汇总到任务中,这样它看起来就像下面的第二个表

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