0

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

クエリで実行する必要があるのは、その月の毎日の残高を計算し、金額を合計してから、当月の日数で割ることです。

特定の日に取引がない場合、残高は同じままです。

したがって、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 が月の最終日でない場合、前月の平均は最終日のみで割る必要があります。この例では、6 月は 30 ではなく 23 で割る必要があります。

結果は次のようになります。その月の日次合計の平均

どんな助けでも大歓迎です!

ありがとう

4

1 に答える 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
于 2012-06-23T13:40:55.870 に答える