Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » rulezDC 09:10
 » PiotrexP 09:06
 » emigrus 09:06
 » XepeR 09:00
 » Fl@sh 08:51
 » DJopek 08:44
 » NimnuL 08:19
 » cVas 08:12
 » Dexter 08:10
 » kyusi 08:09
 » Syzyf 08:05
 » dugi 08:04
 » Kenny 08:00
 » Dhoine 07:52
 » resmedia 07:09
 » PeKa 06:38
 » NWN 05:07

 Dzisiaj przeczytano
 41134 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2024
A R C H I W A L N A   W I A D O M O Ś Ć
    

Mam pytanie z SQL - kolumna saldo w tabeli , Master/Pentium 22/07/11 13:49
Mam tabelkę do wyświetlenia, wybieram odpowiednie dane z tabel selektem i jest prawie OK. Prawie w kolejnych wierszach (pozycjach) mam określone przychody/wydatki (WN/MA). A panie chcą saldo tj. sumę wszystkich WN i MA od początku tabeli do AKTUALNEJ pozycji.
Czyli w skrócie - Jak w SQL odwołać się wyniku selekt'a w POPRZEDNIM wierszu?

Nie ma tego złego , co by się w gorsze
obrócić nie mogło - jak nie wierzysz
włącz komputer :-)

  1. mhm , celt 22/07/11 14:00
    uzyc group by date ?

    Everything should be made as simple as
    possible, but no simpler

  2. Zapytaj google o: sql "running total" , Tig3r 22/07/11 14:07
    http://www.1keydata.com/...sql-running-totals.html

    http://stackoverflow.com/...-to-the-current-record

  3. może jakiś kursorek jeśli danych nie ma dużo , Tomasz 22/07/11 14:47
    w wyniku z SELECTa? Jaki silnik BD?

    https://www.siepomaga.pl/milosz-mosko

    1. bo jesli m$ , Tomasz 22/07/11 15:04
      to wypróbuj COMPUTE BY wraz z grupowaniem.

      Menah: to jest suma ogólna a Master szuka sumy przyrostowej

      https://www.siepomaga.pl/milosz-mosko

    2. o tym pomysłałem ale ... , Master/Pentium 22/07/11 15:56
      totalnie się na tym nie znam a i kod tego wygląda dość egzotycznie.
      Baza to Oracle.

      Nie ma tego złego , co by się w gorsze
      obrócić nie mogło - jak nie wierzysz
      włącz komputer :-)

  4. a moze tak , Menah 22/07/11 14:55
    select sum(wn),sum(ma) from tabela

    W sumie to ja nie wierzę w ten internet

    1. dobre! , bwana 22/07/11 15:13
      bardzo dobre!:-D

      "you don't need your smile when I cut
      your throat"

    2. to jest suma ogólna , Master/Pentium 22/07/11 15:55
      a ja faktycznie potrzebuję przyrostową.

      Nie ma tego złego , co by się w gorsze
      obrócić nie mogło - jak nie wierzysz
      włącz komputer :-)

  5. jeśli to SQL Oracle to mogę Ci pomóc , bwana 22/07/11 15:13
    ogólnie przy zastosowaniu tzw. funkcji analitycznych wykonasz running totals. O ile pamiętam, na Postgresie możesz to zrobić tworząc funkcję - co do innych silników kompletnie się nie wypowiem, bo się nie znam.

    "you don't need your smile when I cut
    your throat"

    1. tak, Oracle , Master/Pentium 22/07/11 15:53
      ...

      Nie ma tego złego , co by się w gorsze
      obrócić nie mogło - jak nie wierzysz
      włącz komputer :-)

      1. no to lecimy , bwana 24/07/11 21:35
        z założenia będzie znacznie wydajniej niż metodami detail join agregat (znacznie wydajniej przy dużym wolumenie danych).

        Struktura danych dla przykładu: tabela, gdzie jest po kilka rekordów dla tego samego identyfikatora osoby (person_id) i gdzie object_version_number to jakaś liczba.


        sumę narastająco liczymy tak:

        select person_id, effective_start_date, object_version_number,
        sum(object_version_number) over (partition by person_id order by effective_start_date rows unbounded preceding) sovn
        from per_all_assignments_f

        i dostajemy w wyniku (kawałek):

        21 1979/03/12 14 14
        21 2002/01/01 40 54
        21 2008/01/07 576 630
        21 2009/07/13 670 1300
        21 2009/10/01 773 2073
        21 2009/12/01 999 3072
        21 2010/09/01 1320 4392
        22 1977/03/17 27 27
        22 2002/01/01 53 80
        22 2008/01/07 690 770
        22 2009/10/20 689 1459
        23 1977/09/15 16 16
        23 2007/10/15 281 297
        23 2008/10/01 478 775

        Kluczowe jest to, że po funkcji sum(object_version_number) jest dodana definicja partycji wg której liczymy funkcję sum()

        Uwaga! ważna jest np. klauzula order by w definicji partycji - wiersze do sumy częściowej będą układane właśnie w takiej kolejności jak to określono w order by w def. partycji a nie w order by całego zapytania.

        Jeśli chcemy mieć tylko jedną partycję to zamiast "partition by person_id" dalibyśmy "partition by null".

        "rows unbounded preceding" oznacza - od początku partycji do bieżącego wiersza. Można też zadać okno "rows 5 preceding" - ostatnie pięć wierszy albo "rows 5 following" - NASTĘPNE pięć wierszy. Ogólnie polecam Ci zapoznanie się z tymi funkcjami Oracle SQL bo mają power.

        Tu fajne opracowanie: http://www.orafaq.com/node/55

        "you don't need your smile when I cut
        your throat"

  6. Ma być jednorazowo czy na stałe? , Conroy 22/07/11 15:34
    Koszmarnie nie wydajna i prosta wersja (z podzapytaniem) wygląda tak:
    id - zakładam, żę tabela ma kolumnę auto increment z id

    SELECT WN, MA, (
    SELECT SUM(WN) + SUM(MA) as 'saldo' FROM table WHERE id < 666
    )
    FROM table WHERE id = 666


    Rozwiązanie koszmarne i powinno zadziałać (nie będę robił tabelki aby sprawdzić).

    http://flickr.com/photos/myhacien
    da

  7. W Oracle do wartości z poprzednich/kolejnych wierszy możesz odwołać się przez LAG/LEAD , Rhobaak 22/07/11 16:05
    Ogólnie poszukaj pod hasłem 'funkcje analityczne'.

    Kor2dual3,2hZ overkloc,4Gbit Ram
    G-forc 460 gietex,barakudy
    Children of Neostrada Association MVP

  8. spróbuj , Zajkos 22/07/11 23:15
    CROSS JOINa tabeli z samą sobą, np (robione w Accessie dla tabeli tbTest z kolumnami Nazwa1, Opis1, Wn, MA )
    SELECT tbTest.nazwa1, tbTest.opis1, tbTest.WN, tbTest.MA, Sum(IIf([tbtest_1].[nazwa1]<[tbtest].[nazwa1] Or [tbtest_1].[nazwa1]=[tbtest].[nazwa1] And [tbtest_1].[opis1]<=[tbtest].[opis1],[tbtest_1].[WN],0)) AS [WN nar], Sum(IIf([tbtest_1].[nazwa1]<[tbtest].[nazwa1] Or [tbtest_1].[nazwa1]=[tbtest].[nazwa1] And [tbtest_1].[opis1]<=[tbtest].[opis1],[tbtest_1].[MA],0)) AS [MA nar]
    FROM tbTest, tbTest AS tbTest_1
    GROUP BY tbTest.nazwa1, tbTest.opis1, tbTest.WN, tbTest.MA;

    1. odnoszę wrażenie, że to zapytanie raczej szybko się nie wykona. , Master/Pentium 22/07/11 23:39
      na razie powalczę z funkcjami analitycznymi - wyglądają najbardziej rozsądnie.

      Nie ma tego złego , co by się w gorsze
      obrócić nie mogło - jak nie wierzysz
      włącz komputer :-)

    
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL