2014-11-26 2 views
0

Мне нужно написать запрос, который рассчитает разницу между последним концом месяца и концом месяца и разницей между концом прошлого года и концом месяца. Я создал образец базы данных в sqlfiddle http://sqlfiddle.com/#!4/b9749 В моей базе данных самая важная дата всегда на конце месяца, но, как вы можете видеть в примере, есть и другие даты, но я не могу использовать значения из этих дат. Когда я запустить этот запрос с condidtion, что дата = «2014-04-30» результат должен быть таким:Разница в предыдущем месяце и разница в конце года в оракуле sql

date  product amount  last_month_diff  last_year_end_diff 
2014-04-30  a1  350    -150     650 
2014-04-30  b1  123    -123     1877 

, когда я запустить этот запрос с condidtion, что дата = «2014-05-31» результат должно быть, как это

date  product amount  last_month_diff  last_year_end_diff 
2014-05-31  a1  400     -50     600 
2014-05-31  b1  500    -377     1500 
2014-05-31  c1  200     0      0 

и когда я выполнить этот запрос с condidtion, датирующей = «2014-06-30» результата должен быть, как этот

date  product amount  last_month_diff  last_year_end_diff 
2014-06-30  b1  780    -280     1220 
2014-06-30  c1  100     100      0 

На первом я думал, что я использую аналитические функции (лаг), но у меня может быть много да tes между двумя месяцами, и я не знаю, как достичь ожидаемого результата.

ответ

0

Попробуйте что-нибудь вроде ребра.

with input_date as (select to_date('2014-04-30', 'YYYY-MM-DD') d from dual), 
sot_tot as (select product, 
        sum(case when extract(month from date_) = extract(month from d) then amount else 0end) amount,  
        sum(case when extract(month from date_) = extract(month from last_day(add_months(d, -1))) then amount else 0 end) previous_month_amount 
      from sot, input_date 
      where date_ <= d 
      group by product) 

select product, amount, previous_month_amount - amount as previos_month_diff 
    from sot_tot 

я был не в состоянии понять, что вы имеете в виду difference between last month-end and month-end and difference between last year-end and month-end. Однако решение будет очень похож на один выше, и вы можете играть с комбинацией суммы и случай для достижения желаемого результата.

+0

спасибо. Я изменил ваш запрос, добавив нулевые значения вместо 0 в выражениях case. Есть ли способ исключить продукты, которые не существуют в текущую дату? Например, продукт 'c1' в этом результате? http://sqlfiddle.com/#!4/b9749/35 – Koles

+0

Попробуйте контролировать это в разделе 'where'. Вероятно, что-то вроде 'where amount is not null 'будет делать. – mikron

+0

Конечно, спасибо. – Koles

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