1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| WITH foo (date, amount, devise) AS
(
SELECT date '2014-06-26', 50, 'eur' union ALL
SELECT date '2014-06-27', 10, 'usd' union ALL
SELECT date '2014-06-28', 20, 'eur' union ALL
SELECT date '2014-06-29', 30, 'usd' union ALL
SELECT date '2014-06-30', 40, 'usd'
)
, cal (cal_jour) AS
(
SELECT dt
FROM (SELECT date '2014-06-01' + generate_series(0,60)) AS sr (dt)
WHERE dt < date '2015-01-01'
)
, sr AS
(
SELECT cal.cal_jour
, dvs.devise
, foo.devise as devise_foo
, SUM(coalesce(foo.amount, 0)) AS daily_amount
, SUM(SUM(coalesce(foo.amount, 0))) OVER(PARTITION BY dvs.devise ORDER BY cal_jour ROWS 1 PRECEDING) rolling
FROM cal
CROSS JOIN (select distinct devise from foo) as dvs
LEFT JOIN foo
ON foo.date = cal.cal_jour
AND foo.devise = dvs.devise
WHERE cal.cal_jour BETWEEN date '2014-06-26' AND date '2014-06-30'
GROUP BY cal.cal_jour
, dvs.devise
, foo.devise
)
select cal_jour, devise, daily_amount, rolling
from SR
where devise_foo is not null
ORDER BY cal_jour ASC; |
Partager