Odejmowanie wierszy SQL

0

Witam,
Taka oto tabelka:

PESEL|pole|styczen|luty|marzec
---------------- | -------------------
1234|1200| 2500,00| 2500,00|2500,00
1234|1210|150,00|150,00|150,00
4321|1200| 1500,00| 1500,00|1500,00
4321|1210|135,00|135,00|135,00
2341|1200|2000,00|2000,00|2000,00
2341|1210|100,00|100,00|100,00

Chce uzyskać wynik odejmowania (POLE 1200-1210) dla danego numeru pesel w danym miesiącu czyli coś takiego:

PESEL|pole|styczen|luty|marzec
---------------- | -------------------
1234|roznica| 2350,00| 2350,00|2350,00
4321|roznica| 1365,00| 1365,00|1365,00
2341|roznica|1900,00|1900,00|1900,00

0

A skąd wiesz który od którego odjąć?

0
Marcin.Miga napisał(a):

A skąd wiesz który od którego odjąć?

Po wartości w kolumnie POLE dla danego PESEL. Dla danego PESEL zawsze są dwie wartości dla kolumny Pole 1200 oraz 1210 które są odejmowane.

0

Widzisz różnicę między (1200, 1210) a (1210, 1200)?
Baza nie widzi - dla niej to zbiory...

0
Marcin.Miga napisał(a):

Widzisz różnicę między (1200, 1210) a (1210, 1200)?
Baza nie widzi - dla niej to zbiory...

Czyli, nie ma takiej możliwości, możliwości?

1

ja bym to tak zrobił (jakby były np 2 wpisy dla nip=1234 i pole = 1200)

select 
  nip, 
  sum((case when pole = 1210 then -1 else 1 end) * styczen) styczen, 
  sum((case when pole = 1210 then -1 else 1 end) * luty) luty,
  sum((case when pole = 1210 then -1 else 1 end) * marzec) marzec
from
  tabela
group by
  nip
0

Możesz użyć window functions, kod dla Postgres:

WITH sampledata AS
(
 SELECT * FROM (
 VALUES
    (1234, 1200, 2500.00, 2500.00, 2500.00),
    (1234, 1210, 150.00,  150.00,  150.00),
    (4321, 1200, 1500.00, 1500.00, 1500.00),
    (4321, 1210, 135.00,  135.00,  135.00),
    (2341, 1200, 2000.00, 2000.00, 2000.00),
    (2341, 1210, 100.00,  100.00,  100.00)
 ) AS xxx( pesel, pole, styczen, luty, marzec)
),
resultwithnullrows AS
(
 SELECT 
  pesel, 
  row_number()            OVER wnd,
  styczen - lead(styczen) OVER wnd AS styczen,
  luty    - lead(luty)    OVER wnd AS luty,
  marzec  - lead(marzec)  OVER wnd AS marzec
 FROM sampledata
 WINDOW wnd AS (PARTITION BY pesel ORDER BY pole)
)
SELECT pesel, styczen, luty, marzec
FROM resultwithnullrows WHERE row_number=1

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