在 Microsoft Access 中创建查询方差(差异)分析

Creating a query variance (difference) analysis in Microsoft Access

我有一项特定任务需要帮助。

基本上我有销售 table:

Product_ID/No   Product_Name    Date          Revenue
       A              APPLE     01-01-20       50
       B              BANANA    01-01-20       100
       A              APPLE     15-12-19       50
       B              BANANA    15-12-19       150
       C              CHERRY    15-12-19       50
       A              APPLE     01-01-20       60

我需要从这个 table 每月创建一个差异报告 (difference/movement),其中 headers:

Product_ID/No   Product_Name    Current_Month   Previous_Month  Variance
    A             Apple             110         50               60
    B             Banana            100         150             -50
    C             Cherry            50          -50

问题:

我该怎么做?

这会是一系列 SQL 声明吗?

如有任何建议,我们将不胜感激。

谢谢

您可以按产品分组并使用条件聚合:

SELECT 
  [Product_ID/No], [Product_Name], 
  SUM(IIF(DATESERIAL(YEAR(DATE()), MONTH(DATE()), 1) = DATESERIAL(YEAR([Date]), MONTH([Date]), 1), Revenue, NULL)) AS Current_Month,
  SUM(IIF(DATESERIAL(YEAR(DATEADD("m", -1, DATE())), MONTH(DATEADD("m", -1, DATE())), 1) = DATESERIAL(YEAR([Date]), MONTH([Date]), 1), Revenue, NULL)) AS Previous_Month,
  Nz(Current_Month)- Nz(Previous_Month) AS Variance
FROM Sales
GROUP BY [Product_ID/No], [Product_Name]

结果:

Product_ID/No   Product_Name    Current_Month   Previous_Month  Variance
A               APPLE           110             50              60
B               BANANA          100             150             -50
C               CHERRY                          50              -50

此查询针对 SQL 服务器:

WITH Temp
AS (SELECT [Product_ID/No],
           [Product_Name],
           ISNULL(SUM(IIF(DATEPART(MONTH, GETDATE()) = DATEPART(MONTH, [Date]), Revenue, NULL)), 0) AS Current_Month,
           ISNULL(SUM(IIF(DATEPART(MONTH, DATEADD(MONTH, -1, GETDATE())) = DATEPART(MONTH, [Date]), Revenue, NULL)), 0) AS Previous_Month
    FROM dbo.Sales
    GROUP BY [Product_ID/No],
             [Product_Name])
SELECT *,
       (Temp.Current_Month - Temp.Previous_Month) AS Variance
FROM Temp;