Hirdetés
- Dobná a fizikai kezelőszerveket a Sony gamepad koncepciója
- 3DMark 11 eredmények
- Milyen CPU léghűtést vegyek?
- OLED monitor topic
- Mindent a látványért: DeepCool CG380 3F gépház tesztje
- Milyen TV-t vegyek?
- Vezetékes FEJhallgatók
- Új Xeonokkal szorongatná meg az Intel az AMD-t
- TCL LCD és LED TV-k
- Nyomtató topik
Új hozzászólás Aktív témák
-
nyunyu
félisten
válasz
Apollo17hu
#5214
üzenetére
Az a baj, hogy az előző lépésben számolt értékre van szükséged a következő kiszámolásához, és nem szimplán szummázod a korábbi értékeket.
Így vagy rekurzívan számolod ki, vagy ciklust írsz rá.
Ezekre nem nagyon van szabvány szintaxis, kb. minden DBnek más megoldása van rá.
Oracle alatt valahogy így nézne ki a ciklusos megoldás:
DECLARE
v_id varchar2(10);
v_ertek number;
v_korr_ertek number := 0;
CURSOR c is
SELECT id, ertek
FROM proba
ORDER BY id;
BEGIN
OPEN c;
LOOP
FETCH c INTO v_id, v_ertek;
EXIT WHEN c%notfound;
v_korr_ertek := CASE WHEN v_korr_ertek + v_ertek > 0
THEN 0
ELSE v_korr_ertek + v_ertek
END;
dbms_output.put_line(v_id || ',' || v_ertek || ',' || v_korr_ertek);
/*
UPDATE proba
SET korr_ertek = v_korr_ertek
WHERE id = v_id;
*/
END LOOP;
CLOSE c;
END;Deklarálsz egy kurzort, amiben azonosító szerint növekvő sorrendben jönnek a rekordok, aztán azon egyesével végig mész, kiszámolva az aktuális korrigált értéket.
-
Apollo17hu
őstag
válasz
Apollo17hu
#5214
üzenetére
Többé-kevésbé sikerült összeraknom. Álljon itt az utókornak:
WITH t AS(SELECT t.id,t.ertek,row_number() over(ORDER BY t.id) AS seqnumFROM (SELECT 'A' AS "ID",-2 AS "ERTEK" FROM dualUNION ALLSELECT 'B',-5 FROM dualUNION ALLSELECT 'C',-1 FROM dualUNION ALLSELECT 'D', 3 FROM dualUNION ALLSELECT 'E',10 FROM dualUNION ALLSELECT 'F',-7 FROM dualUNION ALLSELECT 'G',-4 FROM dualUNION ALLSELECT 'H',20 FROM dualUNION ALLSELECT 'I',-1 FROM dualUNION ALLSELECT 'J',-3 FROM dual) t),cte(id,ertek,runningsum,seqnum) AS(SELECT ID,ertek,(CASEWHEN ertek > 0 THEN0ELSEertekEND) AS runningsum,seqnumFROM tWHERE t.seqnum = 1UNION ALLSELECT cte.id,t.ertek,(CASEWHEN t.ertek + cte.runningsum > 0 THEN0ELSEt.ertek + cte.runningsumEND) AS runningsum,t.seqnumFROM cteJOIN tON t.seqnum = cte.seqnum + 1/*AND t.id = cte.id*/)SELECT cte.ertek, cte.runningsum AS korr_ertekFROM cteORDER BY seqnum -
pch
senior tag
válasz
Apollo17hu
#5214
üzenetére
Ha csak annyi hogyha nagyobb mint 0 akkor legyen nulla akkor arra ott az if
IF(eredmeny>0,0,eredmény) -
nyunyu
félisten
válasz
Apollo17hu
#5214
üzenetére
Mint az egyszeri matekpélda, ahol az első megállóban felszáll 2 ember a buszra, másodiknál leszáll 5, akkor hány embernek kell felszállnia a harmadiknál, hogy senki ne legyen a buszon?
Új hozzászólás Aktív témák
- Mesterséges intelligencia topik
- Google Pixel topik
- Miskolc és környéke adok-veszek-beszélgetek
- Dobná a fizikai kezelőszerveket a Sony gamepad koncepciója
- 3DMark 11 eredmények
- Milyen CPU léghűtést vegyek?
- Telekom mobilszolgáltatások
- Nem tudom a dal címét, előadóját
- Real Racing 3 - Freemium csoda
- Milyen routert?
- További aktív témák...
- Gamer PC: Ryzen 5 5600 I B550 WiFi6 I 16GB DDR4 I RX 590 8GB I 1TB NVMe I 1000W I HAF XB EVO
- Samsung 850 EVO 1TB Sata3 SSD / Beszámítás OK!
- Intel I7-7700K / Beszámítás OK!
- Új állapotban! Lenovo ThinkPad T14 Gen 3 i5-1245/16gb ram/256 ssd FHD+ garancia
- !AKCIÓ! GAMER PC Intel Core i9-10900X/ASUS ROG Strix X299-E Gaming/NVIDIA GeForce RTX 3080/32 GB RAM
- MEDION ERAZER Cooling Kit V2 Vízhűtés - MD 62737 Beast 16 X1 gamer laptophoz
- AKCIÓ!! HP Zbook Studio G8 i7-11850H 32GB 512GB Nvidia Quadro T1200 400NIT, 100% sRGB Garis!
- MacBook Pro 13, 14, 15, 16, MacBook Air M1, M2 M3 M4 bill magyarosítás lézerrel / sapkacserével
- Telefon felvásárlás!! iPhone 12 Mini/iPhone 12/iPhone 12 Pro/iPhone 12 Pro Max
- GYÖNYÖRŰ iPhone 15 Pro Max 256GB Blue Titanium-1 ÉV GARANCIA -Kártyafüggetlen, MS4480
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: Central PC számítógép és laptop szerviz - Pécs
Város: Pécs


