1

Temat: Zapytanie sumowanie w podziale na okresy

Mam taką tabelę:
id_sprzedawcy |    data    |  suma
---------------+------------+---------
            11 | 2009-07-20 | 1100.00
            22 | 2009-07-27 | 1100.00
            11 | 2005-07-27 |  620.00
            31 | 2009-08-07 | 2403.20
            33 | 2009-08-12 | 4822.00
            52 | 2009-08-14 | 4066.00
            52 | 2009-08-15 |  295.00
            82 | 2009-08-15 |    0.00
            23 | 2011-06-11 |  340.00
            23 | 2012-03-22 | 1000.00
            23 | 2012-04-08 | 1000.00
            23 | 2012-07-13 |   36.00
            23 | 2013-07-17 | 2480.00
            23 | 2014-04-09 | 1000.00
            23 | 2014-06-10 | 1500.00
            23 | 2014-07-20 |  700.50

Potrzebuję zapytanie które zwróci mi dla każdego id_sprzedawca serie co dwa lata od najmniejszej daty danego sprzedawcy a następnej kolumnie sum(suma) z tego właśnie okresu.

id_sprzdawca | okres | sum(suma)

Nie wiem jak to zrobić w postgresie. Mogę napisać to w PHP ale zastanawiam się czy wykonywanie skryptu w php nie będzie zbytnio ociążało serwera. Te kilka przykładowych rekordów to tylko namiastka tego co siedzi w tabeli. Będę wdzięczny za pomoc.

2

Odp: Zapytanie sumowanie w podziale na okresy

Generalnie uzyskałem efekt, który chciałem ... prawie :-(. Może ktoś umi poprawić zapytanie bo w wygenerowanych datach wszędzie widnieje taka sama suma. Nie potrafię smucić bazy by suma dokonywana była dla każdego przedziału czasowego:

select m.id_sprzedawcy,generate_series(m.min::date,current_date()::date,'2 years')::date,sum(s.suma) from sprzedaz s, minmax m where s.id_sprzedawca=m.id_sprzdawca group by m.id_sprzedawca,m.min,m.max order by 1,2;

id_sprzedawcy |   data    |  suma
---------------+----------------+---------
         23 | 2011-06-11      |  12382.71
         23 | 2013-06-11      |  12382.71
         23 | 2015-06-11      |  12382.71


Jak widać utworzyłem drugą pomocniczą tabelę o strukturze id_sprzedawca,min,max gdzie przechowuję minimalną datę i maksymalną w powiązaniu z id_sprzedawca. Nie wiem skąd ta suma bo nawet jak zrobię sum(suma) ze wszystkiego to powinno wyjść około 6000 - więc coś się dubluje (źle liczy).

Pomoc pilnie potrzebna :-)

Ostatnio edytowany przez mik (2015-11-01 11:01:24)

3

Odp: Zapytanie sumowanie w podziale na okresy

ja proponuje małą zmianę
  select id_sprzedawcy
        ,d.data_start::date
        ,sum(suma)
   from (select *,min(data) over (partition by id_sprzedawcy) as data_min from sprzedaz) s
       ,generate_series(s.data_min,s.data,interval '2 years') d(data_start)
  where s.data between d.data_start and d.data_start+interval '2 years'
  group by
         id_sprzedawcy
        ,d.data_start
order by 1,2