【问题标题】:SQL Query / Stored proc to count monthly average of daily sumsSQL查询/存储过程来计算每日总和的月平均值
【发布时间】:2012-06-25 13:30:25
【问题描述】:

我使用的是 Firebird 2.1。

我可以使用一些帮助来创建以下查询或存储过程。

我需要列出每日零用现金交易总额的月平均值。

让我解释一下:

TABLE PettyCash(RowID, TDate, InOut, Amount)

  • 1 2012-01-01 0 5.000
  • 2 2012-01-01 1 3.000
  • 3 2012-01-05 0 4.000
  • 4 2012-01-23 1 2.000
  • 5 2012-02-20 1 5.000

如果是传入事务,则 InOut = 0,如果是传出事务,则 InOut = 1

查询要做的是计算当月每一天的余额,将金额相加,然后除以当月的天数。

如果某一天没有交易,余额保持不变。

所以在一月份是这样的:

  • 2012-01-01 2.000
  • 2012-01-02 2.000
  • 2012-01-03 2.000
  • ...
  • 2012-01-05 6.000

等等。

为了使事情复杂化,总是有一个从去年开始的余额(加起来就是今年的余额)。

我是这样计算的:

SELECT SUM(IIF(INOUT = 0, AMOUNT, -AMOUNT))
FROM PETTYCASH
WHERE TDATE < '2012-01-01';

应为生成的查询或存储过程指定开始日期和结束日期 - 开始日期始终是一年的第一天,结束日期可以是一年中的给定日期,即:StartDate = 2012 -01-01,结束日期 = 2012-06-23

如果 EndDate 不是一个月的最后一天,则最后一个月的平均值应仅除以最后一天,在示例中,六月应除以 23 而不是 30。

结果应该是这样的: 月 |本月每日平均金额

任何帮助将不胜感激!

谢谢

【问题讨论】:

    标签: sql query-optimization firebird firebird2.1


    【解决方案1】:

    您需要的是子查询。内部子查询计算每天的总和,外部查询计算平均值。

    我不熟悉 firebird 的日期功能,但它确实有“提取”功能。以下使用它来获得您想要的:

    select yr, mon, avg(amt)
    from (SELECT extract(year from tdate) as yr, extract(month from tdate) as mon,
                 extract(day from tdate) as day,
                 SUM(IIF(INOUT = 0, AMOUNT, -AMOUNT)) as amt
          FROM PETTYCASH
          WHERE TDATE < '2012-01-01'
          group by extract(year from tdate), extract(month from tdate),
                   extract(day from tdate)
         ) t
    group by yr, mon
    order by yr, mon
    

    【讨论】:

    • 嘿,感谢您的询问,但我认为这不是我所需要的——我可能还不清楚,但每个月都会累积余额。所以有一个从去年结转的余额,新的交易被添加到那个,然后在下个月新的交易被添加到上个月的最终余额中,等等......
    • 在这种情况下,您需要一个累积和。您可以在 Oracle 或 SQL Server 2012 中轻松完成此操作。您需要一个自加入来获得 Firebird 中的累积总和。最简单的可能是在应用程序级别进行求和。
    • 我决定写一个存储过程。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多