- Milyen belső merevlemezt vegyek?
- Azonnali processzoros kérdések órája
- SSD kibeszélő
- Projektor topic
- AMD GPU-k jövője - amit tudni vélünk
- Intel Core i3 / i5 / i7 / i9 10xxx "Comet Lake" és i3 / i5 / i7 / i9 11xxx "Rocket Lake" (LGA1200)
- Melyik tápegységet vegyem?
- BIOS frissítés
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Milyen SSD-t vegyek?
Hirdetés
-
OneSport OT05 - finomhangolás
ma Mit hiányoltunk eddig a kedvező árfekvésű kínai bringákból a leginkább? A nyomatékszenzort. A OneSport újdonsága végre megkapta ezt a megoldást.
-
Megérkezett Magyarországra a Samsung új OLED gaming monitora
ph Az Odyssey OLED G8 32 hüvelyes, sík OLED panellel dolgozik.
-
Retro Kocka Kuckó 2024
lo Megint eltelt egy esztendő, ezért mögyünk retrokockulni Vásárhelyre! Gyere velünk gyereknapon!
Új hozzászólás Aktív témák
-
nyunyu
félisten
válasz Fundiego #3600 üzenetére
Ablakozó függvénnyel beszámozod a pilótánkénti helyezéseket, majd leválogatod, melyik lett az első, második, harmadik?
Oracle alatt valami ilyesmi lenne:
with eredmeny
as (select id,
ev,
vegeredmeny,
pilota,
pont,
row_number() over (partition by ev, pilota order by vegeredmeny, id) eredmeny
from futam)
SELECT e.pilota,
SUM( e.pont ),
e1.vegeredmeny er1,
e2.vegeredmeny er2,
e3.vegeredmeny er3,
e3.vegeredmeny er4
FROM eredmeny e
join eredmeny e1
on e1.ev=e.ev
and e1.pilota=e.pilota
and e1.eredmeny=1
join eredmeny e2
on e2.ev=e.ev
and e2.pilota=e.pilota
and e2.eredmeny=2
join eredmeny e3
on e3.ev=e.ev
and e3.pilota=e.pilota
and e3.eredmeny=3
join eredmeny e4
on e4.ev=e.ev
and e4.pilota=e.pilota
and e4.eredmeny=4
WHERE e.ev = 2017
GROUP BY e.pilota,
e1.vegeredmeny,
e2.vegeredmeny,
e3.vegeredmeny,
e4.vegeredmeny
ORDER BY SUM( e.pont ) DESC;[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
bpx
őstag
select * from (
select * from (
select
pilota, sum(pont) over (partition by pilota) as sum_pont,
vegeredmeny,
row_number() over (partition by pilota order by vegeredmeny) rn
from futam) where rn <= 4
) pivot
(min(vegeredmeny) for rn in (1 as er1, 2 as er2, 3 as er3, 4 as er4))
order by sum_pont desc;De szerintem MySQL lesz a kérdés.
-
Fundiego
tag
nem vagyok pro ebben, de ha jól értem akkor mysql-ben nem megy se a pivot se a rank funkció :/
-
Fundiego
tag
végül máshogy oldottam meg, mivel tudni lehet h milyen értékeket vehet fel.azonban problémába ütköztem, mert rangsorolni akarom a lent látható kód szerint sum(pont) etc etc. viszont a rank függvényem abc szerint ad számot a sornak, hova kellene rakni a függvényt?
SELECT pilota ,IFNULL(SUM(Pont),0) AS 'Pontok',(@row_number:=@row_number + 1) AS sorszam,
COUNT(*),
SUM(CASE WHEN vegeredmeny = '1' THEN 1 ELSE 0 END) as egy,
SUM(CASE WHEN vegeredmeny = '2' THEN 1 ELSE 0 END) as ketto,
SUM(CASE WHEN vegeredmeny = '3' THEN 1 ELSE 0 END) as harom,
SUM(CASE WHEN vegeredmeny = '4' THEN 1 ELSE 0 END) as negy,
SUM(CASE WHEN vegeredmeny = '5' THEN 1 ELSE 0 END) as ot,
SUM(CASE WHEN vegeredmeny = '6' THEN 1 ELSE 0 END) as hat,
SUM(CASE WHEN vegeredmeny = '7' THEN 1 ELSE 0 END) as het
FROM futam
WHERE ev='2016'
GROUP BY pilota
order by sum(pont) desc,egy desc, ketto desc, harom desc, negy desc, ot desc, hat desc, het desc -
Torry
addikt
Sziasztok!
Valószínűleg nagyon alap a kérdés, de kérlek segítsetek.
A symbol ügyviteli rendszer adatbázisát szeretném FTP-re rakni, ha minden igaz Firebird-t használ.Ehhez nekem milyen FTP-t kell bérelnem?
Van esetleg ph olvasók álatl ajánlott szolgáltató?Köszi,
P -
bambano
titán
-
#65304576
törölt tag
-
bandi0000
nagyúr
adatbázisban tudnátok segíteni?
céges feladatot aminek leírása itt van, viszont nem igazán jutunk dűlőre, miszerint van egy foglalás táblánk, ahol tároljuk a foglalás időpontját, a foglaló nevét, és a szolgáltatást, meg van egy szolgáltatás táblánk ahol gyakorlatilag a szolgáltatások neve, ideje, ára van, és ha minden igaz, akkor a kulcsok a szolgáltatások neve, elküldtük a tervet a cégnek, de olyasmit írtak vissza, hogy több a többhöz kapcsolat legyen a két tábla között, amit nem értünk, mert 1 szolgáltatás tartozhat több foglaláshoz, de fordítva talán csak úgy, ha úgy tárolnánk a foglalást, hogy 1 mezőbe több szolgáltatást is felsorolnánk nem?mert mi úgy gondoltuk a tárolást, hogy ha egyszerre többet akarnak foglalni, akkor egymás után tároljuk szolgáltatásonként, illetve egyedi kezdési dátummal, tehát egymás után
Xbox One: bandymnc
-
nyunyu
félisten
válasz bandi0000 #3612 üzenetére
N:M reláció:
Jól látod, foglalásnak külön tábla kell 4 oszloppal:
- foglalt termék idegen kulcsa
- foglaló vevő idegen kulcsa
- foglalás ideje
- foglalás áraMajd az itt tárolt külső kulcsokkal joinolod össze a foglalót a foglalt termékkel.
[szerk:]Céges feladat? Ez inkább egy állásinterjúhoz szakmai beugrónak tűnik, amit fél délután össze lehet rakni.
[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
bandi0000
nagyúr
-
nyunyu
félisten
válasz bandi0000 #3614 üzenetére
Úgy több-több a kapcsolat, hogy egy vásárló több eladótól is vehet (az mindegy, hogy mikor), de egy eladó termékeit is több vevő veheti.
Labor házidra ugyanez igaz, egy ember több fodrászhoz is foglalhat időpontot, de egy fodrásznak is több vendége van egy nap, és ezek egymástól függetlenek.
Minden egyes tranzakció egy új rekord lesz a foglalásos táblában.
[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
varsam
őstag
Sziasztok,
szerintetek melyik gyorsabb?
TO_CHAR(tábla.dátum_mező,'YYYY.MM.DD.') >= '2017.11.01.'
--vagy
tábla.dátum_mező >= TO_DATE('2017.11.01.','YYYY.MM.DD.')
Én azt mondanám, hogy a második egyértelműen, mivel az első először minden értéket characterré alakít át majd utána szűr, a másik pedig egy rendes dátum szűrés.
Kollégánál láttam az elsőt, érdekelne, hogy mennyivel lehet az lassabb? -
bpx
őstag
Az első változatot irtani kell.
Nem az átalakítás a nagy munka, hanem az, hogy ha index van az oszlopon, akkor az tipikusan a tábla.dátum_mező-re van, és nem pedig a to_char(tábla.dátum_mező...)-re, így a lekérdezés nem tudja használni az indexet, teljes táblát olvas, lassú. Persze lehet function based indexet létrehozni a to_char(tábla.dátum_mező...)-re is, de erre az esetre nem ez a helyes megoldás.
Ezen kívül az ilyen átalakításoknál az optimizer számosságbecslései is pontatlanak lehetnek, hiszen dátum típusnál tudja, hogy pl. 2017-01-01 előtt a 2016-12-31 van, de ha ugyanezt stringként kell becsülni, akkor olyan értékek is lehetségesek, amelyek dátumnál nem, pl. 2017-00AAAAAA, 2016-999990000, stb.
-
updog
senior tag
A válasz: attól függ Ha DATE típusú a meződ, és indexált, akkor nyilván ha egy DATE-tel hasonlítod össze (TO_DATE), akkor végigrohan az indexen és kidobja amit keresel.
Ellenben ha ezt a meződ TO_CHAR-ozod, nem fogja tudni használni az indexet. (pl.) Oracle-ben itt lehet csavarni egyet a dolgon function based indexszel, csinálhatsz olyan indexet, ami nem a mezőt, hanem a TO_CHAR(mező)-t indexeli, akkor ugyanolyan gyors lesz.
Amúgy ha nem lenne index a mezőn, kb. mindegy lenne performancia szempontból, praktikusan a TO_DATE(feltétel)-t szokták használni, ha a mező DATE.
(#3618) -Zeratul- jepp. Egyszer én is futottam egy hasonlóba (DATE mezőn volt index, és TO_CHAR-ozták, hogy egy string-gel összehasonlítsák... Mekkora volt az öröm mikor mutattam hogy 500%-os performancia javulás történt, miután átírtam
[ Szerkesztve ]
"Bocs, főnök, de én csak két emberben bízom. Az egyik én vagyok. Nem maga a másik." || "Hóhahó, mégis van graffaló!"
-
Pé
senior tag
Sziasztok. Kéne gyorsan írnom egy MS SQL scriptet, de nem értek hozzá, és az istennek nem akar működni.
Feladat: egy szerver összes adatbázisában van egy tábla, ahonnan a usereket ki kéne listázni. Ez eddig rendben is van, működik. Viszont szeretném a db nevét berakni az első oszlopba. Ez sehogy sem sikerülA script:
SET NOCOUNT ON
DECLARE @sql varchar(max) = ''SELECT @sql = @sql + CASE @sql when '' then '' else ' UNION ALL ' end + '
SELECT '+dbs.name+' AS Tenant
,[AU_CODE]
,[AU_STATE]
,[AU_PASSWD_VALIDITY]
,[AU_PASSWD_NEVER_EXPIRE] FROM [' + dbs.name + '].[dbo].[ACCESS_USER]'
FROM sys.sysdatabases dbs
WHERE dbs.name NOT IN ('master', 'tempdb', 'msdb', 'model')EXEC(@sql)
A SELECT '+dbs.name+' AS Tenant sorral van a gebasz. Nem tudom hogy hogy lehet az aktuális db nevét oda belerakni.
-
nyunyu
félisten
Ránézésre az lesz a baja, hogy nem stringként van beillesztve a dinamikus querybe a táblanév.
Körbe kéne rakni aposztróffal, valahogy így:
SELECT '''+dbs.name+''' AS Tenant[szerk:]T-SQLben dupla aposztróffal kell escapelni az aposztrófot, nem \' mint más nyelveken.
[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
bandi0000
nagyúr
sziasztok
nem biztos hogy pont ide, de hátha valaki tudna segíteni
Most vettük az adatbázis normalizálást, és nem tudná elmagyarázni valaki konyha nyelven a 2.-3. normál formákat, értem nagyjából a fogalmat, de nem látom hogy azt hogyan tudom rá húzni egy egyszerű adatbázisra, hogy rögtön lássam, mit kell ki rakni külön táblába
pl itt se nagyon értem, hogy 2NF-nél kiszedte a közép iskola címét nevét, de az általános címe,neve benne maradt, és azt csak a 3NF-be szedte ki
Xbox One: bandymnc
-
Szmeby
tag
válasz bandi0000 #3624 üzenetére
Szevasz,
én nem tudom elmagyarázni, de az biztos, hogy az iskolán kívül nem kell először kettesbe, majd hármasba forgatni, hanem a cél, hogy minél előbb kellően normalizált legyen az a DB, és gyorsan szállítsuk a megrendelőnek, mert már tűkön ül, hogy miért nincs még kész.
2NF
Ha eltekintünk attól a ténytől, hogy a valóságban egy gyerek több általánosba is járhat, és a példánál megszabjuk, hogy márpedig nem járhat, akkor nyilvánvalóvá válik, hogy egy gyerek csak egy általánosba jár, így a középiskolás kiszervezésével meg is van a 2nf. Gondolom. Mivel a gyerek önmagában meghatározza az általános iskolát is. Amiből csak egy lehet, mint ahogy korábban megszabtuk. Míg középsuliból több is, így szükségessé válik a gyerek duplikációk megszüntetése. Amit egy szuper kis kapcsolótáblával oldunk meg. Így 1 tanuló csak egyszer fog szerepelni a tanulók táblában, mert már nincsenek ott azok a csúnya középiskolák, amelyek megduplázták (megtöbbszörözték) a sorok számát.3NF
Viszont azt is látjuk, hogy ez még nem elég, mert ugyan a gyerekek már egyediek, de a Csillagvár bizony kétszer is feltűnik, két gyerek is ugyanoda jár. Ez nagy pazarlás, minden gyereknél nyilvántartani ugyanannak a sulinak a címét. Mi van, ha a suli elköltözik? Vagy kedves vezetőnk átnevezi az utcát, mert ahhoz van kedve? Elkezdjük tömegesen átírogatni a tanulók tábláját azért, mert az iskola adataiban valami megváltozott? Ha kézzel kellene átírnod, neked se lenne természetes a mosolyod egy néhány tízezres tanulóbázis esetén. Mennyivel egyszerűbb lenne 1 helyen átírni a suli címét, és az automatikusan az összes adott suliba járó gyerekre igazzá válna. Hát ezért szervezzük ki az általános iskolát is külön táblába. Felhívnám a figyelmet, hogy ez esetben egy-több a kapcsolat, így a kapcsolótábla szükségtelen.Összefoglalva: Úgy látom, a 2NF arra jó, hogy a sok-sok duplikált SOROK számát csökkentsük le. A tanulók táblában a tanulók a fontosak, vagyis a cél, hogy soronként különböző tanulókat lássunk. Ne szerepeljen két sorban ugyanaz a tanuló. A 3NF pedig arra jó, hogy az adott táblában található kiegészítő (értsd: a tanuló személyéhez nemigazán tartozó) ADATOK ne szerepeljenek feleslegesen többször, mert ha azokat át kell írni, az halál.
Hogy mi az, ami nem tartozik a tanuló személyéhez? Azt érezned kell. A neved például a tiéd, a születési dátumod is a tiéd, mivel az nem változhat, vagy ha változik, akkor te is változol vele. A lakcímed pl. nem a tiéd, mert simán elköltözhetsz, és más költözhet a te címedre. A sulid sem a tiéd, mert rajtad kívül sokan mások is abba a suliba járnak, még a mobilod sem a tiéd, mert bármikor lecserélheted, másnak adhatod. Ami nem a tiéd, nem a téged nyilvántartó táblába tartozik, hanem egy másikba.
Persze megfontolás kérdése, ha csak az iskola nevét akarjuk a tanulónál tárolni, akkor még akár maradhat is a tanuló táblában. Nem szép, de van olyan helyzet, amikor ez a hatékonyabb. De ha mondjuk a suli neve mellett a suli címe is nyilvántartásra kerül, meg a suli alapításának éve, meg az ott dolgozó tanárok száma, stb stb... Azt már nehéz megmagyarázni, hogy a suli alapításának éve mit is keres a tanulók nyilvántartásában. A gyereknek semmi köze hozzá, mikor alapították az iskolát. Szóval ha már ilyen kacifántos tranzitív függőségeket látsz, akkor szólaljon meg benned a csengő, hogy ez külön táblát kíván.Lehet, hogy mégis sikerült elmagyarázni? Az okosok javítsanak ki, ha hülyeséget írtam.
-
Jimi Tudeski
újonc
Sziasztok!
Holnapra kéne az unokaöcsémnek, én már rég nem dolgozok oracleben, ha valaki holnap reggelig megmondaná akkor nagyon nagyon megköszönném...
Listázd ki azon autók rendszámát, amelyek beszerzési ára legfeljebb 10000 forinttal tér el egy másik autó beszerzési árától!
Vigyázz arra, hogy saját magukhoz ne hasonlítsd az autókat! -
bambano
titán
válasz Jimi Tudeski #3628 üzenetére
én valami ilyesmit írnék:
select a1.* from autok a1, autok a2 where a1.rendszam<a2.rendszam and abs(a1.ar-a2.ar)<=10000;
én meg sosem dolgoztam oracle-vel
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
bambano
titán
válasz pvt.peter #3630 üzenetére
jogos a kérdés, így utólag és nappal ( ) belegondolva lehet, hogy != kellett volna oda.
egyébként igen, a legtöbb ilyen feladatnál arra jó, hogyha mátrixnak képzeled el a halmaz saját magával vett szorzatát, akkor csak az egyik háromszög-félmátrixot listázza.
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
BeeGee2115
csendes tag
Sziasztok!
Adott egy Synology DS, amelyen phpMyAdmin és mögötte MariaDB10 leledzik.
Ebben létrehoztam egy adatbázist, amiben pedig egy csodaszép adattáblát több ezer sorral. Gyönyörűen mennek a lekérdezések, és bár kezdőnek számítok az SQL-ben, egész hamar kiismertem magam ebben a világban. Azonban most szükségem lenne a ti tudásotokra!Az alapok a problémához:
Adatok tábla tartalmazza a következő oszlopokat (többek között):
..., Számla (egy számla neve varchar 255 NOT NULL), Összeg (a pénzösszeg double NOT NULL), Tranzakció (egy számla neve varchar 255), ...Létezik nagyjából 12 féle különböző számla. (Készpénz, Bankkártya... stb).
Az adatbázis soraiban a következő szabályok élnek:
- A számla oszlop sohasem lehet üres
- Az összeg lehet pozitív vagy negatív (bevétel vagy kiadás)
- A tranzakció oszlopban csak akkor szerepel számlanév, ha egyik számláról mozgatunk át összeget a másikra, de ebben az esetben az összeg csak pozitív lehet (mert a mozgatás iránya kötött: Tranzakció -> Számla)Szeretnék egy lekérdezést/nézetet/másik táblát (tökmindegy), ahol az első oszlopban a lehetséges Számla nevek szerepelnek, majd a következő oszlopban az egyenlegek, amik ezzel az agyafúrt logikával számolódnak.
Magamtól odáig jutottam, hogy SELECT DISTINCT-el létrehoztam egy `Szamlak` táblát és abban egy Számla és egy Egyenleg oszlopot, ahol az Egyenleget így UPDATE-elem:
UPDATE `Szamlak` SET `Szamlak`.`Egyenleg` = (SELECT SUM(`Adatok`.`Összeg`) FROM `Adatok` WHERE `Adatok`.`Számla` = `Szamlak`.`Számla`) - (SELECT SUM(`Adatok`.`Összeg`) FROM `Adatok` WHERE `Adatok`.`Tranzakció` = `Szamlak`.`Számla`);
Ez már majdnem jó, de azoknál a számlaneveknél, ahol szóköz van, egyszerűen nem számol semmit, az érték 0 marad...
Előre is köszönök minden tippet, segítséget!
Minden (is) lehetséges! <DS218+ (6GB)>
-
tm5
tag
válasz BeeGee2115 #3632 üzenetére
Szerintem nem kell rögtön táblát léterhozni ehhez, mert akkor minden Adatok tábla módosítás (insert/update/delete) után frissítened kellene a Számlák táblát.
Bőven elég egy lekérdezés:SELECT szamla, SUM(osszeg)
FROM adatok
GROUP BY szamlaMondjuk ez negatívval nem tartalmazza azt amikor az egyik számláról mozog a pénz a másikra. Ahhoz az kellene, hogy hozz létre egy negatív sort a "from" számlához is amikor onnan átkerül pénz a másikra.
-
BeeGee2115
csendes tag
Ezt a GROUP BY-t még nem tudtam mire jó, de ezzel sok minden egyszerűsödik. Azonban nekem a számított egyenlegek kellenének, tehát a negatív értelmű tranzakciók is. Nem lehet valami változóba elrakós trükkel ezt egy lekérdezésben megoldani?
Minden (is) lehetséges! <DS218+ (6GB)>
-
Apollo17hu
őstag
válasz BeeGee2115 #3634 üzenetére
Így?
SELECT szamla,
SUM(CASE WHEN osszeg > 0 then osszeg ELSE 0 END) pozitiv,
SUM(CASE WHEN osszeg < 0 then osszeg ELSE 0 END) negativ
FROM adatok
GROUP BY szamla -
BeeGee2115
csendes tag
válasz Apollo17hu #3635 üzenetére
Köszönöm! De a probléma az, hogy ez továbbra is csak a Számla oszlop szerint fog pozitív vagy negatív értékeket listázni nekem. Én azt szeretném elérni, hogy soronként haladva megvizsgáljuk a számla és a tranzakció oszlopokat is és ha a tranzakció üres akkor semmi gond, csak hozzáadjuk az összeget a számla oszlopban lévő számlához (akár pozitív, akár negatív az összeg), ha viszont van tranzakció, akkor (a biztosan pozitív) összeget ki kell vonnunk a tranzakció oszlopban szereplő számla egyenlegéből is.
Vagy egy másfajta megközelítésben szummázzuk az összegeket a számla oszlop szerint, majd kivonunk minden összeget a tranzakció oszlop alapján. És ennek vesszük a rendezett nézetét.
A két lekérdezést külön-külön már össze is raktátok nekem, ezért ezer hála, de a végső megoldást még nem lelem.
A Jézuska megérkezett közben, Boldog Karácsonyt[ Szerkesztve ]
Minden (is) lehetséges! <DS218+ (6GB)>
-
Apollo17hu
őstag
válasz BeeGee2115 #3636 üzenetére
nem vagyok teljesen képben, de talán erre van szükséged:
SELECT szamla,
SUM(osszeg) - SUM(CASE WHEN tranzakcio IS NOT NULL then osszeg ELSE 0 END)
FROM adatok
GROUP BY szamla...ami - ha jól gondolom - egyenértékű ezzel (egyszerűen eldobjuk azokat a rekordokat, amelyek tranzakciót - is - jelölnek):
SELECT szamla,
SUM(osszeg)
FROM adatok
WHERE tranzakcio IS NULL
GROUP BY szamla[ Szerkesztve ]
-
BeeGee2115
csendes tag
válasz Apollo17hu #3637 üzenetére
Kedves Apollo17hu! Azért nem hagyhatjuk ki a tranzakciókat, mert akkor hibás egyenlegeket kapunk, hiszen az egyik számláról a másikra történő átutalások kiesnének a rendszerből.
Ez már majdnem jó:
SELECT Számla,
SUM(Összeg) - SUM(CASE WHEN Tranzakció!='' then Összeg ELSE 0 END) Egyenleg
FROM Adatok
GROUP BY Számla
A probléma az hogy a tranzakció oszlopban lévő aktuális számlanevet kellene valahogy a megfelelő számlából kivonni, hiszen most csak azt vizsgáljuk, hogy üres vagy sem, de nem az értékét. Egy soron belül a tranzakció és számla oszlopok különböző számlaneveket tartalmaznak a tranzakció értelmének megfelelően.Minden (is) lehetséges! <DS218+ (6GB)>
-
Apollo17hu
őstag
válasz BeeGee2115 #3638 üzenetére
Egy mintaadatbázis jól jönne sqlfiddle-ben. Addig is ezt értettem meg a leírtakból:
SELECT
szla.Számla,
szla.szamla_ertek - tran.tranzakcio_ertek
FROM
(SELECT Számla,
SUM(Összeg) AS szamla_ertek
FROM Adatok
GROUP BY Számla) szla
,(SELECT Tranzakció,
SUM(Összeg) AS tranzakcio_ertek
FROM Adatok
GROUP BY Tranzakció) tran
WHERE szla.Számla = tran.Tranzakció(+)Az lenne az elve, hogy külön-külön összesítjük a "Számla" és a "Tranzakció" mezőkben lévő összegeket, és ahol a "Számla" és a "Tranzakció" egyezik, ott a kettőt kivonjuk egymásból.
-
BeeGee2115
csendes tag
válasz BeeGee2115 #3638 üzenetére
Közben agyaltam kicsit és arra jutottam, hogy ennek a két lekérdezésnek a kivonása jelentené a megoldást:
A)
SELECT Számla,
SUM(Összeg) Egyenleg
FROM Adatok
GROUP BY Számla;
B)
SELECT Tranzakció,
SUM(Összeg) Egyenleg
FROM Adatok
WHERE Tranzakció!=''
GROUP BY Tranzakció;A-B hogyan lehetséges?
[ Szerkesztve ]
Minden (is) lehetséges! <DS218+ (6GB)>
-
Apollo17hu
őstag
válasz BeeGee2115 #3640 üzenetére
kb. úgy, ahogy az előbb leírtam: a kettőből 1-1 allekérdezést csinálsz, és számlaszám mentén összekötöd őket, ill. a számlára aggregált allekérdezéshez "gyengén" kötöd a tranzakcióra aggregált allekérdezést (LEFT JOIN, ha a pluszjeles szintaktika nem működne)
-
BeeGee2115
csendes tag
válasz Apollo17hu #3641 üzenetére
Már majdnem jó! A +os szintaktika nem működik, ezért átírtam LEFT JOIN-ra:
SELECT
szla.Számla,
szla.szamla_ertek - tran.tranzakcio_ertek
FROM
(SELECT Számla,
SUM(Összeg) AS szamla_ertek
FROM Adatok
GROUP BY Számla) szla
LEFT JOIN (SELECT Tranzakció,
SUM(Összeg) AS tranzakcio_ertek
FROM Adatok
GROUP BY Tranzakció) tran
ON szla.Számla = tran.TranzakcióErre azonban azokak a számláknak, amelyekről sosem történt tranzakció, nem lesz egyenlege
Minden (is) lehetséges! <DS218+ (6GB)>
-
Apollo17hu
őstag
válasz BeeGee2115 #3642 üzenetére
- tran.tranzakcio_ertek
helyett- nvl(tran.tranzakcio_ertek, 0)
-t használj, és így nem fog "eltűnni" az egyenlegszerk.: Most olvasom, hogy közben magad is rájöttél a megoldásra.
[ Szerkesztve ]
-
BeeGee2115
csendes tag
válasz Apollo17hu #3643 üzenetére
Igen, köszönöm, nálam az IFNULL() volt a nyerő
A végeredmény pedig:SELECT
szla.Számla,
szla.szamla_ertek- IFNULL(tran.tranzakcio_ertek,0) AS Egyenleg
FROM
(SELECT Számla,
SUM(Összeg) AS szamla_ertek
FROM Adatok
GROUP BY Számla) szla
LEFT JOIN (SELECT Tranzakció,
SUM(Összeg) AS tranzakcio_ertek
FROM Adatok
GROUP BY Tranzakció) tran
ON szla.Számla = tran.TranzakcióMinden (is) lehetséges! <DS218+ (6GB)>
-
bambano
titán
postgresben érdekelne az év elejei agyzsibbasztás
van egy halmazom egész számokból. ezeket kellene intervallumok sorozataként felsorolni. tehát ha van 1,2,3,4,6,7,10,11, akkor kapnom kellene egy 1-4,6-7,10-11 sorozatot.Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
tm5
tag
válasz bambano #3645 üzenetére
Ezt sqlfiddleben raktam össze:
/*schema setup:*/
create table t1(c1 integer);
insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (3);
insert into t1 values (4);
insert into t1 values (6);
insert into t1 values (7);
insert into t1 values (10);
insert into t1 values (11);
/*a query:*/
select * from (
select c1,
CASE
WHEN plus1 != kovetkezo THEN 'vegelem'
WHEN minus1 != elozo THEN 'kezdoelem'
WHEN elozo IS NULL THEN 'kezdoelem'
WHEN kovetkezo IS NULL THEN 'vegelem'
ELSE 'kozbulso'
END tipus
from
(select c1, c1-1 minus1, c1+1 plus1, lag(c1) over () elozo, lead(c1) over () kovetkezo from t1) t) tt
where tipus != 'kozbulso';ezután már csak egy pivot kéne, de arra már nem volt energiám
-
nyunyu
félisten
válasz bambano #3645 üzenetére
Ilyesmi feladatba már sikerült belefutnom melóhelyen.
Ottani kódom erősen leegyszerűsítve.DB adminjaink persze nem szoktak szeretni érte, amikor több millió soros táblákból kell kibogarásznom pár tízezer hasznos rekordot, majd azokat intervallumokba rendezni...
Query plant kielemezve mindenféle Cartesian join kerülendő szakszavakkal dobálózva próbálják levenni a rontást a DB performanciáról.Hello IT! Have you tried turning it off and on again?
-
bambano
titán
kösz mindkettőtöknek, de nekem ez egy kicsit bonyolult
én a következőkre jutottam: neten talált ötlet, hogy rakjak a számsorra egy rank()-et. lényeg, hogy subselectben kell legyen a számsor, mert a distinct meg a rank postgresben nem fér össze.a szám-rank() az gyakorlatilag megmondja, hogy hány szám maradt ki eddig a sorból. ami azt is jelenti, hogy egy részsorozaton belül a szám-rank() konstans. vagyis kezelhető group by-jal.
select min(number),max(number),count(*) from (
select number,number-rank() over (order by number) as ranked from (
select distinct number as number from item order by 1) as w
) as q group by ranked order by 1;a legbelső selectből kitöröltem a nem publikus részt.
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
SunyaMacs
aktív tag
Sziasztok!
Lenne 2 táblám hasonló struktúrával:topics:
-topic_id
-topic_by
-topic_name
-topic_timeposts:
-post_id
-topic_id
-post_by
-post_text
-post_timeInnen kéne selectelni a topic id-jét, nevét, és a legutóbbi post idejét(vagy ha nincs ahhoz a topichoz post, akkor a topic idejét)
Ti hogy oldanátok meg?
[ Szerkesztve ]
Új hozzászólás Aktív témák
- 24 Hours of Le Mans
- Építő/felújító topik
- Elektromos cigaretta 🔞
- Milyen légkondit a lakásba?
- Apple Watch Sport - ez is csak egy okosóra
- PHP programozás
- Elektromos autók - motorok
- A fociról könnyedén, egy baráti társaságban
- M0ng00se: Northwood VS Prescott - Előszó, múltidézés
- Asztalos klub
- További aktív témák...