【问题标题】:Daily aggregate calculations for a range of years一系列年份的每日汇总计算
【发布时间】:2016-04-23 03:00:09
【问题描述】:

以下 ACCESS 查询返回一个年份范围内的每日汇总总和。它运行没有错误,但 3 列的结果全为零。如果有人能说出为什么没有正确添加总和,我将不胜感激。

SELECT     
     Month(days.day_start) AS [MONTH], 
     Day(days.day_start) AS [DAY],
     Year(days.day_start) AS [YEAR], 

     (SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2)  
      FROM SALES_RECEIPT
      INNER JOIN INVENTORY ON INVENTORY.INVENTORY_ID = SALES_RECEIPT.INVENTORY_ID 
      WHERE SALES_RECEIPT.[SALE_DATE] >= days.day_start 
       AND SALES_RECEIPT.[SALE_DATE] < days.day_end) AS [Daily Sales Total],

     (SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2) 
      FROM SALES_RECEIPT
      INNER JOIN INVENTORY ON INVENTORY.INVENTORY_ID = SALES_RECEIPT.INVENTORY_ID 
      WHERE SALES_RECEIPT.[SALE_DATE] >= days.day_start 
       AND SALES_RECEIPT.[SALE_DATE] < days.day_end  
       AND SALES_RECEIPT.SALES_TAX_EXEMPT="No") AS [Taxable Sales],

     (SELECT Round(Nz(Sum(sales_receipt.SELLING_PRICE * sales_receipt.quantity),0) ,2) 
     FROM SALES_RECEIPT
     INNER JOIN INVENTORY ON INVENTORY.INVENTORY_ID = SALES_RECEIPT.INVENTORY_ID 
     WHERE SALES_RECEIPT.[SALE_DATE] >= days.day_start 
       AND SALES_RECEIPT.[SALE_DATE] < days.day_end 
       AND SALES_RECEIPT.SALES_TAX_EXEMPT="Yes") AS [Tax Free Sales]

FROM    
   (SELECT 
         DateSerial(Year(sale_date), Month(sale_date), Day(sale_date)) AS day_start,
         DateAdd("s", -1, DateSerial(Year(sale_date), 
                 Month(sale_date), Day(sale_date))) AS day_end

    FROM SALES_RECEIPT
    WHERE sale_date >=  #1/1/2009# AND sale_date < #12/31/2016# 
    GROUP BY Year(sale_date), Month(sale_date), Day(sale_date) 
   ) AS days;

【问题讨论】:

    标签: sql ms-access subquery


    【解决方案1】:

    您的子查询聚合返回零,因为day_end 小于day_start,子查询的WHERE 子句假定日期范围相反。事实上,FROM 子句派生表中指定的day_endsale_date一秒

    DateAdd("s", -1, DateSerial(Year(sale_date), 
                     Month(sale_date), Day(sale_date)) AS day_end
    

    查看DateAdd's 区间值并重新考虑您的需求。顺便说一句,DateSerial() 在这里是多余的。以正间隔正确返回开始日期和结束日期之间的可行范围。以下是开始日期和结束日期之间的 100 天:

    sale_date As day_start,
    DateAdd("d", 100, sale_date) AS day_end
    

    【讨论】:

    • 根据您提供的信息,我能够让它工作。谢谢!!我还有另一个 posting 涉及聚合计算,我希望有人能提供解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2022-10-13
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多