Sumowanie narastające wg DATY - SQL

Odpowiedz Nowy wątek
2019-09-12 11:59
0

Witam,
mam w mej ocenie nie mały orzech do zgryzienia i już nie pierwszy dzień z tym walczę, stąd proszę o pomoc.

Mam przygotowane zapytanie z bazy, gdzie potrzebuję umieścić kolumnę, która będzie sumować:

  • pod warunkiem tego samego indeksu,
  • daty mniejszej, bądź równej tej z danego wiersza;
  • lokalizacji w magazynie (1,2,3,4)
    Zmiany na danym indeksie mogą być na plus (dostawa), bądź na minus (rozchód), stąd w danym wierszu potrzebuję sumę uwzględniającą zmianę przed (daty wcześniejsze), jak i uwzględniającą zmianę w danym wierszu. Odrębnie potrzebuję takie dane dla każdego z magazynów.

najlepiej obrazuje to przykładowa tabela poniżej:
screenshot-20190912115744.png

Bardzo liczę na pomoc, z góry dziękuję za zainteresowanie i chęć podzielenia się wiedzą i umiejętnościami.

Pozostało 580 znaków

2019-09-12 12:08
0

Jaka baza?

Pozostało 580 znaków

2019-09-12 12:21
0

Witam,
zapewne ma wypowiedź zabrzmi mało profesjonalnie, aczkolwiek za profesjonalistę się nie uważam :)
Baza jest na środowisku Microsoft SQL Server, korzystam z oprogramowanie "Microsoft SQL Server Management Studio" do tworzenia niezbędnych widoków, czy przygotowywania raportowania przez inne aplikacje ciągnące dane z tej bazy.

Jeśli mało dokładnie to opisałem to nieświadomie, mam nadzieję, że informacja wystarczająca.

Pozostało 580 znaków

2019-09-12 12:24
0

wersja?

Pozostało 580 znaków

2019-09-12 12:33
0

Windows Server 2008 R2 Standard

Pozostało 580 znaków

2019-09-12 12:44
1

No to zostają joiny:

select
    tb.indeks
    ,tb.magazyn
    ,tb.data
    ,max(tb.zmiana) zmiana
    ,sum(rs.zmiana) as suma
from
   tb
   left join tb rs on rs.indeks=tb.indeks
                      and rs.magazyn=tb.magazyn
                      and tb.data >= rs.data
 group by
     tb.indeks
    ,tb.magazyn
    ,tb.data
 order by
     3,1,2

http://sqlfiddle.com/#!18/5ceea/4

edytowany 1x, ostatnio: Panczo, 2019-09-12 12:46

Pozostało 580 znaków

2019-09-12 12:50
0

Dziękuję za szybką odpowiedź, już próbuję to rozwiązanie zaimplementować w mym zapytaniu, dla potrzeb raportu musiałem 17 tabel połączyć, już je identyfikuję i podejmuję próby...

Pozostało 580 znaków

2019-09-12 13:37
1
select * from magazine;
+--------+-----------+------------+---------+------+
| index1 | magazine1 | date1      | changed | sum1 |
+--------+-----------+------------+---------+------+
|    101 |         1 | 2019-09-12 |      20 |   20 |
|    102 |         1 | 2019-09-13 |      50 |   50 |
|    102 |         2 | 2019-09-14 |     -20 |  -20 |
|    101 |         2 | 2019-09-15 |      -5 |   -5 |
|    102 |         2 | 2019-09-16 |      -5 |  -25 |
|    101 |         1 | 2019-09-17 |      30 |   50 |
|    102 |         1 | 2019-09-18 |     -10 |   40 |
|    101 |         1 | 2019-09-19 |     100 |  150 |
+--------+-----------+------------+---------+------+
select *, sum(changed) over (partition by index1, magazine1 order by date1) as sum2 from magazine order by date1;
+--------+-----------+------------+---------+------+------+
| index1 | magazine1 | date1      | changed | sum1 | sum2 |
+--------+-----------+------------+---------+------+------+
|    101 |         1 | 2019-09-12 |      20 |   20 |   20 |
|    102 |         1 | 2019-09-13 |      50 |   50 |   50 |
|    102 |         2 | 2019-09-14 |     -20 |  -20 |  -20 |
|    101 |         2 | 2019-09-15 |      -5 |   -5 |   -5 |
|    102 |         2 | 2019-09-16 |      -5 |  -25 |  -25 |
|    101 |         1 | 2019-09-17 |      30 |   50 |   50 |
|    102 |         1 | 2019-09-18 |     -10 |   40 |   40 |
|    101 |         1 | 2019-09-19 |     100 |  150 |  150 |
+--------+-----------+------------+---------+------+------+

tutorial

edytowany 3x, ostatnio: Neutral, 2019-09-12 14:19
Tylko na 2008 nie zadziała... - Panczo 2019-09-12 13:40
Tylko po prawdzie OP ostatecznie nie napisał jakiej wersji SQL Servera używa tylko na jakim Windowsie to stoi. Także to dalej jest zagadka. - BlackBad 2019-09-12 13:46

Pozostało 580 znaków

2019-09-12 13:52
1

Będąc zalogowanym do bazy wersje można sprawdzić tak:

Select @@version

Pozostało 580 znaków

2019-09-12 15:30
0

Nadal nie daje mi to spokoju, ciągle próbuję na szereg sposobów i nadal nie udaje mi się.
By cokolwiek podziałać muszę wpiąć się poprzez VPN-a, który jest na tyle niecodzienny., że internet na ten czas odcina :(

Sprawdziłem wersję SQL-a korzystając z podpowiedzi jak to zrobić i jest to "2012 SP1".

druga sugestia dla początkującego wydawała mi się prostsza i oto mam jej wynik, gdzie już nie wiele brakuje:

screenshot-20190912152648.png

czy to oznacza, że wystarczy, że dodam do "order by" jakiś index, który być może znajdę w tabeli rozróżniający poza datą?

Przyznam się szczerze, że nie spodziewałem się tak szybkiej pomocy, jestem pod mega wrażeniem.

Pozostało 580 znaków

2019-09-12 15:47
0

Zadziała dla MySQL:

select
   m.*, 
   (select sum(s.changed) from magazine s where s.index1=m.index1 and s.magazine1=m.magazine1 and s.date1<=m.date1) as sum 
from
   magazine m 
order by
   m.date1;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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