【问题标题】:In MS Access, how do I summarise data based on data within the same query?在 MS Access 中,如何根据同一查询中的数据汇总数据?
【发布时间】:2016-07-12 00:09:11
【问题描述】:

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

这甚至可以使用 Access 查询吗?

提前感谢您的意见。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    考虑汇总查询的派生表,这些表汇总了开销成本并计算了任务项,每个项都由引用连接。然后使用聚合来调整 CostTotal 字段。

    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 
         (SELECT Overheads.Quote, Sum(Overheads.Cost) As OverheadCost
          FROM Overheads
          WHERE Overheads.Task ALIKE '%Overhead%'
          GROUP BY Overheads.Quote) As t2
    ON t1.Quote = t2.Quote)
    
    INNER JOIN
         (SELECT Overheads.Quote, Count(*) As TaskCount
          FROM Overheads
          WHERE Overheads.Task ALIKE '%Task%'
          GROUP BY Overheads.Quote) As t3
    ON t1.Quote = t3.Quote
    
    WHERE t1.Task ALIKE '%Task%';
    
    -- Quote           Task  NewCost   NewTotal
    -- 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
    

    或者,在 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%';
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多