Wątek przeniesiony 2020-07-12 17:42 z Kariera przez furious programming.

SQL - czy ktoś jest w stanie pomóc ?

0

Cześć,

Poległam w trakcie przygotowywania (wydaje mi się, że to proste a przekombinowałam) tabeli w MSSQLserver - może ktoś będzie w stanie naprowadzić mnie na rozwiązanie? pomóc?
Do rzeczy:
Mam tabelę #TAB, w której muszę przeliczyć dwie kolumny (zarys przedstawiam poniżej(dane zmyslone, kolumny takie same)):

okres | in | out | beginning| ends

201701 | 27 | 1 | 145 | 136
201702 | 28 | 5 | 0 | 0
201703 | 35 | 85 | 0 | 0
201704 | 51 | 45 | 0 | 0
201705 | 15 | 45 | 0 | 0

Co potrzebuję zrobić:
*każda wartość beginning powinna być dokładnie wartością ends z okresu wcześniejszegu, czyli wiersza wyżej
*kazda wartość ends = beginning + in - out

Kombinowałam na wszystkie znane mi sposoby, niestety poległam.. pomożecie?

czy tak się w ogóle da?
zaczynam wątpić, albo po prostu brakuje mi doświadczenia i wiedzy ...

a może mnie ponioslo i w mssql tego nie zrobię?

2

Da się, rzuć okiem na window functions. Tutaj potrzebujesz chyba LAG które pozwoli Ci np. pobrać skalar z poprzedniego wiersza (czyli np. jedną kolumnę, albo wartość jakiegoś wyrażenia). W dokumentacji są przykłady użycia.

0

Dzięki :) będę próbować w tę stronę ;)

0

Funkcja fajnie działa :) jednak problem jest z tym "zapetlaniem"
Jak wyzej napisałam, ends liczony jest z bieżącego beginning+in+out, natomiast to bieżące beginning jest poprzednim ends'em...żeby kod mi to policzył dla każdego okresu od 201805 powiedzmy, wydaje mi się, że powinnam zrobić jakąś pętlę albo coś w tym rodzaju - mogę znów poprosić o naprowadzenie? Jeszcze "raczkuje"...
Oczywiście nie proszę o gotowca

1

Ok, czegoś nie doczytałem w pierwszym poście i założyłem, że wystarczy wyciągnąć już istniejącą wartość z poprzedniego wiersza - moja wina.

Ale konieczność odwołania się do jakichś wyników obliczonych dla poprzednich wierszy jest do obejścia - w tej sytuacji zamiast LAG(expression) potrzebna będzie suma krocząca SUM(expression). Żeby zsumować jedynie wiersze poprzedzające dla beginning możesz doprecyzować zakres dla klauzuli OVER argumentem ROWS.

1

Można to policzyć jednym joinem i funkcjami agregującymi

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