【问题标题】:Access Crosstab Query: based on sales totals within TWO date ranges访问交叉表查询:基于两个日期范围内的销售总额
【发布时间】:2016-10-23 09:34:51
【问题描述】:

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

  • 对于分销商:“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]
  • 品牌 = “DprodBrand”(行)

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

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

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

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

【问题讨论】:

  • 感谢大家的想法和合作!我非常感谢您在这项工作中的帮助和参与! ============== 已接受的解决方案:Dale Fye (Access MVP)2016-10-24 我不确定您是否需要 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

标签: sql ms-access crosstab


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    然后创建一个新查询:

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

    【讨论】:

      【解决方案3】:

      作者:Dale Fye(访问 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

      【讨论】:

        猜你喜欢
        • 2019-07-17
        • 1970-01-01
        • 2013-09-28
        • 2019-05-23
        • 1970-01-01
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        • 2023-02-05
        相关资源
        最近更新 更多