我正在使用Firebird 2.1。
我可以使用一些帮助来创建以下查询或存储过程。
我需要列出每日小额现金交易金额的月平均值。
让我解释一下:
TABLE PettyCash(RowID,TDate,InOut,Amount)
InOut = 0如果是传入,InOut = 1,如果它是传出事务
查询的作用是计算当月每天的余额,总结金额,然后除以当月的天数。
如果某一天没有交易,余额保持不变。
所以1月就是这样:
等等。
使问题复杂化的是,从去年开始总是有一个起始余额(这相当于今年的余额)。
我这样计算:
SELECT SUM(IIF(INOUT = 0, AMOUNT, -AMOUNT))
FROM PETTYCASH
WHERE TDATE < '2012-01-01';
生成的查询或存储过程应该给出开始日期和结束日期 - 开始日期始终是一年的第一天,结束日期可以是一年中的给定日期,即:StartDate = 2012 -01-01,EndDate = 2012-06-23
如果EndDate不是一个月的最后一天,则最后几个月的平均值应该仅除以最后一天,在示例中,六月应除以23而不是30。
结果应该是这样的: 月|本月每日总和的平均值
非常感谢任何帮助!
由于
答案 0 :(得分: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