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 :-) - mhm , celt 22/07/11 14:00
uzyc group by date ?Everything should be made as simple as
possible, but no simpler - 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 - 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 - 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 przyrostowejhttps://www.siepomaga.pl/milosz-mosko - 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 :-)
- a moze tak , Menah 22/07/11 14:55
select sum(wn),sum(ma) from tabelaW sumie to ja nie wierzę w ten internet - dobre! , bwana 22/07/11 15:13
bardzo dobre!:-D"you don't need your smile when I cut
your throat" - 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 :-)
- 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" - 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 :-) - 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"
- 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 - 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 - 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;- 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 |
|
|
|
|