Raport [stan początkowy -> obroty - stan końcowy]

0

Witam, mam taką tabelę (w uproszczeniu):

Id IdProd Data Przychod Rozchod
1 1 2016-03-08 5 -
2 1 2016-03-09 - 2
3 1 2016-04-03 2 -
4 1 2016-04-06 - 3
Mam zrobić raport na koniec miesiąca w postaci:
IdProd stan pocz. z poprzed. mies przychody rozchody stan końcowy
---------------- ---------------- ---------------- ---------------- ----------------
1 3 2 3 2
Stan początkowy pobieram tak:
SELECT IdProd,sum(Przychod)-sum(Rozchod) Stan pocz. from test where Data < '2016-04-01' group by IdProd

Obroty pobieram tak:

SELECT IdProd,SUM(Przychod)P, SUM(Rozchod)R FROM test WHERE Data BETWEEN '2016-04-01' and '2016-04-30' group by IdProd

Stan końcowy pobieram tak:

SELECT IdProd,sum(Przychod)-sum(Rozchod) Stan kon. from test group by IdProd

Nie wiem natomiast jak to wszystko złączyć w jedno polecenie sql aby baza zwróciła wynik w jednym wierszu.

1

Jeśli rzeczywiście chcesz to robić w ten sposób to najprościej złączyć to w jedną całość:

select sp.*, ob.p, ob.r, pr.[Stan kon.]  from 
(SELECT IdProd,SUM(Przychod)-SUM(Rozchod) 'Stan pocz.' FROM test WHERE DATA < '2016-04-01' GROUP BY IdProd) sp,
(SELECT IdProd,SUM(Przychod)P, SUM(Rozchod)R FROM test WHERE DATA BETWEEN '2016-04-01' AND '2016-04-30' GROUP BY IdProd) ob,
(SELECT IdProd,SUM(Przychod)-SUM(Rozchod) 'Stan kon.' FROM test GROUP BY IdProd) pr

Jednak masz 3 te same selecty z tym samym grupowaniem. Ja bym to zrobił nieco inaczej:

select s.idProd, sum(stan_konc) 'Stan konc.', sum(stan_pocz) 'Stan pocz.', sum(przychod) 'Przychód', sum(rozchod) 'Rozchód' 
  from (
select t.idProd, sum(coalesce(t.przychod,0) - coalesce(t.rozchod,0)) stan_konc,
       case when t.data <  '2016-04-01' then sum(coalesce(t.przychod,0) - coalesce(t.rozchod,0)) else 0 end Stan_pocz,
       case when t.data between '2016-04-01' AND '2016-04-30' then sum(coalesce(t.przychod,0)) else 0 end przychod, 
       case when t.data between '2016-04-01' AND '2016-04-30' then sum(coalesce(t.rozchod,0)) else 0 end rozchod
  from vvv.test t
 group by t.idProd, t.data) s 
 group by s.idprod

Zapewne da się to jeszcze uprościć bardziej. Ponadto gdybyś chciał to dynamicznie robić nie tylko dla jednego miesiąca tylko poprzedniego to konieczne będzie użycie funkcji lead wszystko zależy od potrzeb

0

Rozwiązanie nr 1 działa dobrze dla jednego produktu (IdProd), dla np. 2 produktów generuje 4 odpowiedzi.
Rozwiązanie nr 2 działa natomiast bardzo dobrze. Dziękuję bardzo za szybkie i skuteczne rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1