访问交叉表查询:基于两个日期范围内的销售总额

Access Crosstab Query: based on sales totals within TWO date ranges

我正在寻找一种方法来为两个不同的日期范围创建 Access 交叉表查询报告销售总额 'Brand'。:

目前,我每个时期都有两个独立的交叉表查询,工作正常。 -> 下面的代码。

我正在寻找一种方法来创建一个查询,以在两个单独的列或一个交叉表查询中显示品牌在每个日期范围内的销售总额。

第 1 期:

TRANSFORM Sum(tblDepletions_DETAIL.detQuan) AS Sales
SELECT tblProducts_DEPL.DprodBrand
FROM tblDepletions INNER JOIN (tblProducts_DEPL INNER JOIN     tblDepletions_DETAIL ON tblProducts_DEPL.DprodZSKU = tblDepletions_DETAIL.detZSKU) ON tblDepletions.depID = tblDepletions_DETAIL.detDeplID
WHERE (((tblDepletions.depDate) Between [forms]![frmRPT_YTDDepl_SF]![BDT1]     And [forms]![frmRPT_YTDDepl_SF]![EDT1]) AND ((tblDepletions.depDistID)=132))
GROUP BY tblProducts_DEPL.DprodBrand
ORDER BY tblProducts_DEPL.DprodBrand
PIVOT Format([depDate],"yy")-(Format(Date(),"yy"))+2 In (1,2);

第 2 期:

TRANSFORM Sum(tblDepletions_DETAIL.detQuan) AS Sales
SELECT tblProducts_DEPL.DprodBrand
FROM tblDepletions INNER JOIN (tblProducts_DEPL INNER JOIN tblDepletions_DETAIL ON tblProducts_DEPL.DprodZSKU = tblDepletions_DETAIL.detZSKU) ON tblDepletions.depID = tblDepletions_DETAIL.detDeplID
WHERE (((tblDepletions.depDate) Between [forms]![frmRPT_YTDDepl_SF]![BDT2] And [forms]![frmRPT_YTDDepl_SF]![EDT2]) AND ((tblDepletions.depDistID)=132))
GROUP BY tblProducts_DEPL.DprodBrand
ORDER BY tblProducts_DEPL.DprodBrand
PIVOT Format([depDate],"yy")-(Format(Date(),"yy"))+2 In (1,2);

非常感谢!!! ~~ 雅各布

考虑像使用 DprodBrand 作为连接键的任何其他查询或表对一样简单地连接两个已保存的交叉表查询:

SELECT CrosstabQ1.DprodBrand, 
       CrosstabQ1.[1] As Period1_Year1, CrosstabQ2.[1] As Period2_Year1,
       CrosstabQ1.[2] As Period1_Year2, CrosstabQ2.[2] As Period2_Year2
FROM CrosstabQ1
INNER JOIN CrosstabQ2 ON CrosstabQ1.DprodBrand = CrosstabQ2.DprodBrand

现在,如果您只希望一个查询完成所有操作,请考虑条件聚合数据透视查询,因为交叉表不能用作子查询。这里迁移WHEREIIF()条件:

SELECT p.DprodBrand,
       SUM(IIF((d.depDate BETWEEN [Forms]![frmRPT_YTDDepl_SF]![BDT1] 
                              AND [Forms]![frmRPT_YTDDepl_SF]![EDT1])
               AND (Format(d.[depDate],"yy")-(Format(Date(),"yy"))+2 = 1), 
               dt.detQuan, NULL)) AS Period1_Year1,

       SUM(IIF((d.depDate BETWEEN [Forms]![frmRPT_YTDDepl_SF]![BDT2]     
                              AND [Forms]![frmRPT_YTDDepl_SF]![EDT2)
               AND (Format(d.[depDate],"yy")-(Format(Date(),"yy"))+2 = 1), 
               dt.detQuan, NULL)) AS Period2_Year1,

       SUM(IIF((d.depDate BETWEEN [Forms]![frmRPT_YTDDepl_SF]![BDT1] 
                              AND [Forms]![frmRPT_YTDDepl_SF]![EDT1])
               AND (Format(d.[depDate],"yy")-(Format(Date(),"yy"))+2 = 2), 
               dt.detQuan, NULL)) AS Period1_Year2,

       SUM(IIF((d.depDate BETWEEN [Forms]![frmRPT_YTDDepl_SF]![BDT2]     
                              AND [Forms]![frmRPT_YTDDepl_SF]![EDT2])
               AND (Format(d.[depDate],"yy")-(Format(Date(),"yy"))+2 = 2), 
               dt.detQuan, NULL)) AS Period2_Year2

FROM tblDepletions d
INNER JOIN (tblProducts_DEPL p
INNER JOIN tblDepletions_DETAIL dt
     ON p.DprodZSKU = dt.detZSKU) 
     ON d.depID = dt.detDeplID

WHERE ((d.depDistID)=132)
GROUP BY p.DprodBrand
ORDER BY p.DprodBrand

因为这是 Access,保存两个查询而忽略 ORDER BY 可能更简单。

然后创建一个新查询:

SELECT *
FROM Q1
UNION ALL
SELECT *
FROM Q2
ORDER BY DprodBrand

作者:Dale Fye(Access MVP):

我不确定您是否需要交叉表。

Select DProdBrand, 
SUM(IIF([DepDate] BETWEEN [Forms]![frmRpt_YTDDepl_SF]![BDT1] 
AND [[forms]![frmRPT_YTDDepl_SF]![EDT1], [Sales], 0) as Period1, 
SUM(IIF([DepDate] Between [forms]![frmRPT_YTDDepl_SF]![BDT2] 
AND [forms]![frmRPT_YTDDepl_SF]![EDT2], [Sales], 0) as Period2, 
SUM([Sales]) as [Sales Total]
FROM yourTable
GROUP BY DProdBrand

https://www.experts-exchange.com/questions/28978325/Access-Crosstab-Query-based-on-sales-totals-within-TWO-date-ranges.html