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

时间:2016-10-23 09:34:52

标签: sql ms-access crosstab

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

  • For Distributor:“DistID”(列,不可见)
  • 销售总额:“销售”(栏目)
  • 两个不同的日期范围:期间1和期间2(列)的“depDate”:
    • Period1 = Between [forms]![frmRPT_YTDDepl_SF]![BDT1] And [forms]![frmRPT_YTDDepl_SF]![EDT1]
    • Period2 = Between [forms]![frmRPT_YTDDepl_SF]![BDT2] And [forms]![frmRPT_YTDDepl_SF]![EDT2]
  • Brands =“DprodBrand”(行)

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

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

PERIOD1:

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);

PERIOD2:

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);

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

3 个答案:

答案 0 :(得分:0)

考虑使用 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

现在,如果您只想要一个查询来完成所有操作,请考虑条件聚合数据透视查询,因为交叉表不能用作子查询。您可以在此处将WHERE迁移到IIF()条件:

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

答案 1 :(得分:0)

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

然后创建一个新查询:

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

答案 2 :(得分:0)

By:Dale Fye(Access MVP):

我不确定你需要一个CrossTab。

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