Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ MySQL _ Mysql - sumowanie inne

Napisany przez: fcppl 3.10.2018, 08:11:45

Witam,

Mam tabele:

id data kwota waluta komentarz

1 | 2018-07-11 | 30 | PLN | AAA
2 | 2018-07-12 | 40 | PLN | BBB
3 | 2018-07-13 | 20 | PLN | CCC
4 | 2018-07-14 | 10 | PLN | DDD
5 | 2018-07-15 | 15 | PLN | EEE

Zapytaniem :

  1. SELECT t.id, t.DATA, t.kwota, t.waluta, t.komentarz, @running_total := @running_total + t.kwota AS stan_kasy FROM kasa t JOIN (SELECT @running_total := 0) r WHERE t.waluta="PLN" ORDER BY t.id ASC;


Otrzymuję:

id data kwota waluta komentarz | stan kasy

1 | 2018-07-11 | 30 | PLN | AAA | 30
2 | 2018-07-12 | 40 | PLN | BBB | 70
3 | 2018-07-13 | 20 | PLN | CCC | 90
4 | 2018-07-14 | 10 | PLN | DDD | 100
5 | 2018-07-15 | 15 | PLN | EEE | 115

Do tego momentu wszystko działa dobrze. Ale jak wybiorę zakres dat zaptaniem:

  1. SELECT t.id, t.DATA, t.kwota, t.waluta, t.komentarz, @running_total := @running_total + t.kwota AS stan_kasy FROM kasa t JOIN (SELECT @running_total := 0) r WHERE t.waluta='PLN' AND t.DATA BETWEEN '2018-07-13' AND '2018-07-14' ORDER BY t.id ASC;


Otrzymam wynik:

id data kwota waluta komentarz | stan kasy

3 | 2018-07-13 | 20 | PLN | CCC | 20
4 | 2018-07-14 | 10 | PLN | EEE | 30

A chciałem uzyskać cos takiego: Czyli pozycja ID 1, 2 laczy się razem i sumuje swoj wynik i jako ID 2, później jest ID 3 i 4.

2 | 2018-07-13 | 70 | PLN | xxx | 70
3 | 2018-07-13 | 20 | PLN | CCC | 90
4 | 2018-07-14 | 10 | PLN | EEE | 100

Napisany przez: trueblue 3.10.2018, 09:00:49

Może tak:

SELECT suma rekordów przed datą z początku zakresu, a wartość kolumny data ustawiona na sztywno jako data z początku zakresu
UNION ALL
SELECT rekordy z zakresu
UNION ALL
SELECT suma rekordów po dacie z końca zakresu, a wartość kolumny data ustawiona na sztywno jako data z końca zakresu (lub inaczej, nie określiłeś co z rekordami po dacie końca)

a cały powyższy UNION jako podzapytanie, na którym dopiero uruchamiasz running sum.

Napisany przez: fcppl 3.10.2018, 09:09:54

rekordy po dacie konca nie sa wazne, poprostu powinny byc anulowane/pominiete. Jezeli jest możliwośc mogę prosić o przykładowe zapytanie jak powinno wygladac według twoich wskazówek ?

Napisany przez: trueblue 3.10.2018, 09:22:44

  1. SELECT tmp.DATA, tmp.kwota, tmp.waluta, tmp.komentarz, @running_total := @running_total + tmp.kwota AS stan_kasy
  2. FROM(
  3. SELECT '2018-07-13' AS DATA, SUM(t.kwota) AS kwota, 'PLN' AS waluta,'' AS komentarz FROM kasa AS t WHERE t.data<'2018-07-13' AND t.waluta='PLN'
  4. UNION ALL
  5. SELECT t.DATA, t.kwota, t.waluta, t.komentarz FROM kasa AS t WHERE t.waluta='PLN' AND t.DATA BETWEEN '2018-07-13' AND '2018-07-14'
  6. ) AS tmp, (SELECT @running_total := 0) AS rs
  7. ORDER BY tmp.DATA;


Napisany przez: fcppl 3.10.2018, 10:22:28

To rozwiązanie działa b.dobrze

Serdecznie dziękuję za pomoc.

Napisany przez: StevDefs 27.08.2019, 07:26:34

Buy Generic Plavix In Us http://rxasian.com Risks Of Propecia Online Prescription Xenical Fat Blocker

Viagra Y Esteroides Dangers With Expired Cephalexin Discount isotretinoin http://viaacost.com Buy Plavix

Buy Prescription Viagra Online Suche Viagra Ch Aleve http://purchasecial.com Northwestern Canada Drugs

Free Amoxicillin Canadian Health Mall http://catabs.com Viagra Kamagra Erfahrung Pastillas Cytotec Donde Las Venden Finasterid 5mg Rezeptfrei Kaufen

Discount Plavix Coupons Prednisolone Nextday http://drugs2k.net Order Orlistat Online

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)