2012-06-23 4 views
0

Я использую Firebird 2.1.SQL Query/Stored proc для подсчета среднемесячной суммы ежедневных сумм

Я мог бы использовать некоторую помощь при создании следующего запроса или хранимой процедуры.

Мне нужно перечислить среднемесячные суммы ежедневных сумм мелких денежных транзакций.

Поясню:

ТАБЛИЦА PettyCash (RowID, TDate, InOut, сумма)

  • 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, EndDate = 2012-06-23

Если EndDate не является последним днем ​​месяца, то в среднем за последние месяцы должно быть разделенный только на последний день, в примере июнь следует разделить на 23 вместо 30.

Результат должен быть таким: Месяц | Среднее суточных сумм за месяц

Любая помощь была бы принята с благодарностью!

Thanks

ответ

1

Что вам нужно, это подзапрос. Внутренний подзапрос вычисляет сумму на каждый день, внешний запрос вычисляет средние значения.

Я не знаком с функциями даты Firebird, но у меня есть функция «extract». Следующее использует это, чтобы получить то, что вы хотите:

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 
+0

Эй, спасибо за запрос, но я не думаю, что это именно то, что мне нужно - я, возможно, не был ясен, но остатки накапливаются в каждом месяце. Таким образом, с прошлого года баланс переносится, к нему добавляются новые транзакции, затем в следующем месяце к окончательному балансу последнего месяца добавляются новые транзакции и т. Д. ... – Steve

+1

В этом случае вам нужна суммарная сумма , Вы можете сделать это в Oracle или SQL Server 2012 довольно легко. Для получения суммарной суммы в Firebird вам необходимо самоподключение. Проще всего было бы сделать сумму на уровне приложения. –

+0

Я решил написать хранимую процедуру. Спасибо за вашу помощь. – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^