Hirdetés

2024. május 2., csütörtök

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  SQL kérdések (kiemelt téma)

Hozzászólások

(#5651) nyunyu válasza pch (#5650) üzenetére


nyunyu
félisten

SELECT nev,
sum(case when jelenlet NOT IN ('99') AND hianyzas NOT IN ('1') then 1 else 0) AS 'hianyzasoknelkul',
sum(case when jelenlet NOT IN ('99') then 1 else 0) AS 'hianyzasokkal'
FROM tabla
group by nev;

Count a nemnull értékek számát adja vissza! (then 1 else null kellene hozzá)
Sum meg az összegét.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5652) nyunyu válasza nyunyu (#5651) üzenetére


nyunyu
félisten

Ha a hiányzás nélküli napok, meg a hiányzott napok fizujának összege kell: sum(case when ... then fizetes else 0)

Hello IT! Have you tried turning it off and on again?

(#5653) Ispy válasza Fundiego (#5649) üzenetére


Ispy
veterán

Vannak hiányoságai, de nem ezen a szintem, ez kb egy 5 perces meló....

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#5654) Fundiego válasza pch (#5650) üzenetére


Fundiego
tag

EZ volna az:

SELECT nev,
COUNT(CASE WHEN fizetes NOT IN ('99') THEN 1 ELSE NULL END) AS 'hiányzások nelkul',
COUNT(CASE WHEN fizetes NOT IN ('99') AND hianyzas NOT IN ('1') THEN 1 ELSE NULL END) AS 'hiányzásokkal'
from table
group by nev;

[ Szerkesztve ]

(#5655) syC


syC
addikt

Sziasztok. Szerintetek hogyan lehetne megoldani egy "joint" két különböző gépen lévő adatbázisbeli tábla között? Valahogy lekérném a kisebbik táblát, eltárolnám valami nézetben vagy temporary table-ként és a másik selectnél pedig beolvasom a megfelelő értékeket. Nagy Bármi ötlet?

(#5656) nyunyu válasza syC (#5655) üzenetére


nyunyu
félisten

Azonos gyártójú adatbázisok között DBLink?
Eltérők között valami 3rd party DB connector megoldás?

De ott az IT biztonsági felelősnek is lesz hozzá pár keresetlen szava, tűzfal kivételek, grantok, stb. konfigurálása miatt.

Utána viszont tudsz olyanokat írkálni, hogy

select *
from tabla t
join tabla2@linkneve t2
on t2.id = t.id;

Nem én üzemeltetem, így nem tudom, nálunk hogyan vannak konfigurálva az SQL Serverek, meg az Oraclek, de van olyan is, hogy nekem kell Insert ... into tabla@dblink után MS SQL eljárást hívnom, hogy dolgozza fel a külső rendszer, de olyan is bőven akad, hogy SQL Server hívogatja az Oracle eljárásainkat.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5657) nyunyu válasza nyunyu (#5656) üzenetére


nyunyu
félisten

MS linked servernek hívja ugyanezt a fícsőrt, és ott az ottani szokások szerint központozva kell a querykben megadni, hogy milyen táblát akarsz elérni: [linkeltgépneve.instanceneve].sémanév.dbo.táblanév

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5658) syC válasza nyunyu (#5657) üzenetére


syC
addikt

Aham. Köszönöm, ezudáig nem találkoztam ezzel a módszerrel. Mysql db-hez kellene, ha jól láttam, elméletben ott is lehetséges. Viszont az üzemeltetés biztosan elkaszálná az ötletet az általad is említett okok miatt. :N

(#5659) nyunyu válasza syC (#5658) üzenetére


nyunyu
félisten

Alternatív megoldások az, hogy időnként kiírod a változást mondjuk csv-be, átmásolódik a másik gépre, az meg beolvassa? Elég idejétmúlt megoldás, de még mindig működik.
Esetleg MQ, webszerviz.

Webszervizért szoktak nálunk a legkevésbé harapni, mondván az illik a legjobban a mikroalkalmazás architektúrába.

Konkrétan még azt se szeretik, ha azonos instanceon lévő másik sémából kéne olvasni ("grant select on tabla to másikséma;"), inkább írattak rá a javásokkal egy új szervizt, amit meg lehet pingelni, aztán az olvassa a választ a másik sémából, vagy írja amit a hívó szeretne.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5660) Gergello


Gergello
addikt

Sziasztok !

Nem igazán ismerem ezt a fulltext keresési módot, de találtam egy lekérdezést, amivel kísérletezek és én is írtam egyet saját kútfőből.

Egy webshop keresést szeretnék megvalósítani, úgy hogy a találatokat relevancia szerint csökkenő sorrendben adja vissza.

Van egy products nevű tábla mindenféle lényegtelen mező mellett a lényegesek:
product_model
product_name
product_description
Ezekből egyedül a product_model-en van btree index. /van id mező is, de azt most nem vettem bele ebbe/
Ezekben szeretnék keresni.

Amit találtam fulltext lekérdezés, annál azt talapasztalom, hogy bárhogy próbáltam a * karakterrel feljavítani az illesztést, nem tudok vele úgy keresni, hogy pl.
a keresőszó: "fúró", akkor a "fémfúró"-t tartalmazó sort nem adja vissza, de a "fúrókészlet"-t igen, csak a szavak kezdetére tudok illeszteni.

Fulltext keresés, nem saját munka: Lehet ezt módosítani, hogy a szavak végére is illesszen? Hiába raktam az elejére (is) csillagot.

SELECT
    product_name,
    (
        (
            1.3 *(
                MATCH(product_name) AGAINST(
                    'lyukfúró*' IN BOOLEAN MODE
                )
            )
        ) +(
            0.6 *(
                MATCH(product_description) AGAINST(
                    'lyukfúró*' IN BOOLEAN MODE
                )
            )
        )
    ) AS relevance
FROM
    products
WHERE
        status = 1
    AND
        (
                (MATCH(product_name, product_description) AGAINST('lyukfúró*' IN BOOLEAN MODE))
            OR 
                LCASE(product_model) LIKE '%lyukfúró%'
        )
ORDER BY
    relevance DESC,
  LCASE(product_name) ASC

Erre találtam ki az alábbi megoldást: Mi erről a véleményetek, nagy baromság ?
Itt a példa keresőszó a "bmw vezérlés benzin", mindegyik szóra csinálok egy ilyen kis csoportot (3 case when) és az where-ben az AND-al kapcsolt részek.

select
    *,
    (case when product_model like '%vezérlés%' then 10 else 0 end) +
    (case when product_name like '%vezérlés%' then 5 else 0 end) +
    (case when product_description like '%vezérlés%' then 2 else 0 end) +
   
(case when product_model like '%bmw%' then 10 else 0 end) +
    (case when product_name like '%bmw%' then 5 else 0 end) +
    (case when product_description like '%bmw%' then 2 else 0 end) +
   
(case when product_model like '%benzin%' then 10 else 0 end) +
    (case when product_name like '%benzin%' then 5 else 0 end) +
    (case when product_description like '%benzin%' then 2 else 0 end) 
    
    as priority
from
    products
where 
        (
            product_model like '%vezérlés%'
        or 
            product_name like '%vezérlés%'
        or 
            product_description like '%vezérlés%'
        )
    
    AND
    
        (
            product_model like '%BMW%'
        or 
            product_name like '%BMW%'
        or 
            product_description like '%BMW%'
        )
        
    AND
    
        (
            product_model like '%benzin%'
        or 
            product_name like '%benzin%'
        or 
            product_description like '%benzin%'
        )
order by 
  priority desc,
    LCASE(product_name) ASC

(#5661) martonx válasza Gergello (#5660) üzenetére


martonx
veterán

Inkább javaslom erre beüzemelni egy ElasticSearch-öt / MeiliSearch-öt, vagy legfapadosabb megoldásnak a Google Custom Search Engine-t behúzni az oldaladra, és azzal keresni. De majd mindjárt jönnek az SQL szakik, és jól ledorongolnak, hogy nem SQL-ben oldanám ezt meg.

[ Szerkesztve ]

Én kérek elnézést!

(#5662) Gergello válasza martonx (#5661) üzenetére


Gergello
addikt

Ez az 1 keresés van az egész oldalon, egy nem túl bonyolult query, szerintem én is normálisan megírtam. Miért rontsam le a Google-essel ? Megjelenítésbe nem is tudom, hogyan illeszthető.

Fizetősöket meg se néztem. Ott láttam, hogy egy konkurencia használja a findologic-ot.

(#5663) martonx válasza Gergello (#5662) üzenetére


martonx
veterán

A többi alternatíva, amit ajánlottam sem fizetős. Más kérdés, hogy azoknak a hosztolását meg kell oldanod valahogy, ami végülis pénzbe kerül. Nekem pl. MeiliSearch lakik egy 1 magos Azure linux VM-en, kemény havi 15 EUR-ért (plusz áfa).
Hidd el, ezek a kereső cuccok sokkal jobbak, mint amit magadnak raksz össze, pl. typo tűréstől kezdve csomó mindent tudnak.

Én kérek elnézést!

(#5664) Kommy


Kommy
veterán

Sziasztok!

3 tábla:
-tartozékok
-gépek
- melyik géphez melyik tartozék tartozik

egy olyan lekérdezésre lenne szükségem ami listázza az összes tartozékot és az adott gépet amire szűrnénk.

igazából az lenne a problémám, hogy ha nem szűrnék gépre akkor meglenne a lekérdezés, de akkor az összes gép benne van. Tehát csak adott gépre kellene, ott kellene lennie az összes tartozéknak

(#5665) nyunyu válasza Kommy (#5664) üzenetére


nyunyu
félisten

Összejoinolod a 3 táblát, majd a wherebe írod a gépnév feltételt.
select g.gepnev, t.*
from gep g
join gep_tartozek gt
on gt.gep_id = g.id
join tartozek t
on t.id = gt.tartozek_id
where upper(g.gepnev) = 'KALAPÁCS';

Régi szintaxissal nem írom le, tessenek a szabványt használni.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5666) syC válasza nyunyu (#5659) üzenetére


syC
addikt

Sajnos az nem jó, mert olyan intenzitással jönnek az adatok hogy másodpercenként kb 100x változik a tábla. Végül megoldottam temporary table-lel, favágó módon: Kiszedem az egyik gépből az adatokat, majd a másik gépen felépítek belőle egy temporary table-t, amivel már tudok joinolgatni. Szerencse, hogy a szolgáltatás, amihez kell, nem fix periodikus futású, hanem prompt. De mindenesetre köszönöm az előző tippet.

(#5667) nyunyu válasza syC (#5666) üzenetére


nyunyu
félisten

Akkor replikáld a táblát az első gépről a másodikra, akkor automatikusan frissülni fog a másolat, amit helyben már tudsz használni.

Persze ehhez is kellenek a tűzfal szabályok...

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5668) nyunyu válasza nyunyu (#5667) üzenetére


nyunyu
félisten

Nálunk úgy van megoldva az Oracle alatt megváltozott szerződések továbbítása, hogy rá van téve egy-egy insert meg update trigger a szerződések táblába, ami kiírja egy temp táblába a módosult rekord rowid-ját.

Aztán van egy eljárás, ami a temp táblába kiírt azonosítójú rekordokból felépít egy material viewt a szerződés+kapcsolódó ügyféladatok aktuális tartalmával, majd törli a tempet, ezzel azt érjük el, hogy a matviewban csak az utolsó szinkronizáció óta megváltozott rekordok tartalma lesz meg.

Amikor az SQL Servert használó dokumentumkezelő rendszernek olyanja van, a DBConnectoron keresztül meghívja ezt az eljárást, aztán a matviewban látható aktuális adatokkal megupdateli a saját tábláit.

Nyilván ha két szinkronizáció között többször változik egy rekord (pl. frissül az ügyfél címe, aztán az igazolványszáma), akkor többször fog bekerülni az azonosítója a tempbe, de a belőle épített matviewban már csak egyszer fog szerepelni, a legfrissebb adattartalommal.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5669) syC válasza nyunyu (#5667) üzenetére


syC
addikt

Az a szerver, amin joinolom, már alapból egy replika, szóval sztem ez bukta.

(#5670) cog777


cog777
senior tag

Remelem belefer egy DB kerdes ide. Szoval implementaltunk egy schema-t (postgresql), par table, adatok stb.
Egyik kollega jon hogy o most szeretne hozzaadni 2 plussz adatot az egyik tablahoz. Total nem kapcsolodik a mostani projekthez. Mondtam neki hogy csinaljon egy sajat DB-t abba rakja bele a sajat tablajat. Ennek ellenere ragaszkodik ahhoz hogy a mi DB-k be rakja bele, mondvan igy gyorsabban meg van csinalva. Lesz egy mitingunk a nagyobb fonokokkel nemsokara.

Ti hogy csinaljatok? 1 DB ala tobb egymashoz szorosan nem kapcsolodo dolgokat is beletesztek (persze a termekhez azert kapcsolodik) vagy kulon DB-t csinaltok 1-1 nem kapcsolodo funkciohoz?
Koszi a tanacsokat.

Eddig azt az elvet vallottam hogy minden nagyobb funkcionak sajat fuggetlen DB-t csinaljuk, igy pl tranzakciok nem zavarjak egymast, illetve a verzio kezeles konnyebben megvalosithato.

HP ZBook Workstation A3000 - Linux Mint; Raspberry Pi4 - Raspbian

(#5671) Ispy válasza cog777 (#5670) üzenetére


Ispy
veterán

Üzleti döntés, ennyi info alapján nem lehet mit mondani, lehet így is meg úgy is.

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#5672) nyunyu válasza cog777 (#5670) üzenetére


nyunyu
félisten

Nálunk alkalmazásonként külön DB van, és még azt sem szeretik, ha egyik sémából átnyúlok a másikba.
(Kivéve az adattárházasoknak, dokumentumkezelőnek kiajánlott tábláknál, nézeteknél. Itt lehet csak grant, meg synonym a saját sémájukban.)

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5673) bambano válasza cog777 (#5670) üzenetére


bambano
titán

a tábla szerkezetét az adatstruktúra normalizálása alakítja ki és nem más.
a másik alapvető dolog, hogy a redundanciából és a szinkronizálásból *MINDIG* baj lesz inkább előbb, mint utóbb.

egyébként postgresben fel lehet csatolni másik adatbázist, végszükség esetén ez is jó lehet. a te tábládat a kolléga felcsatolja egy saját adatbázisba és mellérakja külön táblában a saját mezőit.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#5674) cog777


cog777
senior tag

Nagyon köszi a hozzászólásokat!!!

HP ZBook Workstation A3000 - Linux Mint; Raspberry Pi4 - Raspbian

(#5675) Panhard


Panhard
tag

Sziasztok! Segítséget szeretnék kérni. Van egy ilyen lekérdezésem:
select cast(datetime as DATE) as datum from tabla1 group by datum desc
Ez csoportba rendezi a dátumokat és kilistázza. Szeretném ezt öt táblára megcsinálni egy lekérdezéssel. Tehát az öt táblában az összes egyforma dátumot csoportba teszi, és sorrendben kilistázza. Tudnátok ebben segíteni?

(#5676) Ispy válasza Panhard (#5675) üzenetére


Ispy
veterán

Union all az 5 selectre, bevágod az egészet egy subselectbe és ott order by rá.

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#5677) Panhard válasza Ispy (#5676) üzenetére


Panhard
tag

Tökéletes. Köszönöm! :R

(#5678) cog777


cog777
senior tag

Lenne egy hulye kerdesem:
ha van egy project tablam (ID (serial), Nev)
es van egy Naplozas tablam (ID (serial), Nev, ... Project_ID (foreign key)
Ezek a tablak a projetc_id-n keresztu ossze vannak kapcsolva.

Jobb otlet lenne ha a Naplozas tablaban a primary key az nem serial hanem project_id+Nev?
Tehat osszetett kulcsot hasznalok azonositani a rekordokat es az a Project table ID-je + Naplozas tabla neve?

Szerintem az utobbi esetben tul nagy lenne az elsodleges kuklcs, mivel a nev az TEXT tipus, es ha fel akarom hasznalni egy harmadik tablaba az Naplozas elsodleges kulcsot (project id + nev) az tul nagy meretu?
Pl harmadik tabla:
Adatok tabla ahol:
Elsodlege kulcs: ID
Foreign key: Naplozas.project id + nev?

HP ZBook Workstation A3000 - Linux Mint; Raspberry Pi4 - Raspbian

(#5679) kw3v865


kw3v865
senior tag

Sziasztok!

PostgreSQL-lel kapcsolatos kérdésem lenne: adott egy tábla az egyik adatbázisban, amelynek a tartalma folyamatosan változik (elég gyakran insert-álódnak bele rekordok). Van egy másik adatbázisom (ugyanazon a szerveren), amelyben szintén lennie van egy ilyen tábla azonos struktúrával (ugyanazok a mezőnevek stb.). A cél az lenne, hogy az "A" tábla tartalma szinkronizálódjon a "B" táblába automatikusan. Nem baj, ha nem azonnal, úgy is jó, ha mondjuk csak 5 percenként. Csak egyirányú szinkronizációra van szükség, és elég, ha csak az insert-ekre vonatkozik.

A kérdésem az lenne, hogy szerintetek hogyan lehet ezt a legegyszerűbben megoldani? A replikáció kicsit bonyolultnak tűnik számomra egyelőre, a másik amit kinéztem az a db-link + trigger kombinációja és elméletileg talán jó lehet. Vajon utóbbi működhet? Esetleg van jobb ötletetek?

(#5680) bambano válasza kw3v865 (#5679) üzenetére


bambano
titán

Ez [link] tűnik a legegyszerűbbnek. lásd doksiban a create publication.
itt [link] van a psql összefoglaló doksija.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#5681) kw3v865 válasza bambano (#5680) üzenetére


kw3v865
senior tag

Köszönöm! Jó a leírás, működik a logikai replikáció, teljesen megfelel az elvárásaimnak.

(#5682) bugizozi


bugizozi
őstag

Sziasztok!

Van egy Veeam szerverünk, amire domain felhasználóval lépünk be. Ki szeretnénk venni a domain-ból a szervert, ezért létrehoztam egy local usert, beletettem az Administrators csoportba, be is tudok vele lépni, viszont az MSSQL-ben csak az egyik adatbázist (VeeamOne2) látom, a másikat (VeeamBackup) nem. :F (nem vagyok egy nagy SQL guru, nézzétek el nekem :B)
Itt hozzáadtam a local user-t, beállítottam ugyanúgy mint ahogy a domaines user van, mégse jó. Azt se tudom az egyik db-t miért látja, és azt se hogy a másikat miért nem. :(
Van esetleg valakinek valami ötlete erre?

Köszi! :R

[ Szerkesztve ]

VCP7-DCV, CCNA ||| Ami működik, ahhoz nem szabad hozzányúlni!

(#5683) kw3v865 válasza kw3v865 (#5681) üzenetére


kw3v865
senior tag

Na, most mégiscsak megakadtam a logikai replikációnál: triggert (vagy rule-t, mindegy) szeretnék rakni arra a táblára, ahová replikálódik az eredeti tábla tartalma. Egyelőre nem tudtam működésre bírni. Hibát nem dob, csak egyszerűen nem csinál semmit.
Egy tök egyszerű triggerről van szó a példa kedvéért: egy másik táblába insertál valamit, ha meghívódik (insertre van ráállítva).

CREATE OR REPLACE FUNCTION valami()
RETURNS TRIGGER
LANGUAGE PLPGSQL
AS $$
BEGIN
INSERT INTO t2 (c) VALUES ('xyz');
RETURN NEW;
END;
$$

CREATE TRIGGER trg
AFTER INSERT ON t1
FOR EACH ROW
EXECUTE PROCEDURE valami()

Azt találtam, hogy külön engedélyezni kell ilyen esetben a triggert: ALTER TABLE t1 ENABLE ALWAYS TRIGGER trig;
Ez megtörtént, de hiába.

Ha nem az "eredeti", hanem a replikátum táblába insert-álok, akkor meghívódik. Viszont én azt szeretném, hogy akkor is működjön, ha az eredeti táblába insert-álok valamit. Rule-lal sem megy.
Vajon mi lehet ennek az oka?

(#5684) szabeska


szabeska
addikt

Sziasztok!

Adott 3 db Windows 8.1-es pc, az egyiken sql express telepitve egyetlen egy adatbazis fajllal, amit egy fapados kis programmal hasznalunk mindharom gepen evek ota problemamentesen. Szeretnenk windows 11-re frissiteni a gepeket, ezert csinaltunk egy szuz w11-es gepet, rajta csak a kis programmal, de sehogyan sem latja a 8.1-en levo adatbazist. Probaltunk meg egy gepet felhuzni 11-el, sql expresst feltelepitettuk ra, de a ket w11-es gep kozott sem erjuk el az adatbazis fajlt. Fajlmegosztas mukodik, a halozaton latjuk a gepet, de nem mukodik az adatbazis fajl elerese, napok ota kuzdunk vele. Van valamilyen w11 specifikus oka/beallitas esetleg, hogy mi okozhatja? Virusirtokat, tuzfalakat kikapcsolva sem megy, ami 8.1-es gepek kozott igen. :R

[ Szerkesztve ]

F1

(#5685) MTbc


MTbc
senior tag

Sziasztok, szeretném megtudni hogy az SQL Express limitációit elérjük-e, lehetséges ez van erre valami jó megoldás, milyen logokat érdemes bogarászni?

A 10Gb adatbázis korlátot azt könnyű megnézni, de a Buffer pool memory-t és a CPU core limitet lehet valahogy ezt jól elemezni? tablazat express vs standard
Úgy érzem nagyon penge élen táncolunk és szeretnék pontosabban látni. Költség fontos, de ha tudok prezentálni kézzel fogható számokat, akkor hamarabb lesz rá pénz. :R Autodesk rajznyilvántartó szoftverről beszélünk és csak 4 user használja abból is csak 3 aktívan.
Köszönöm

(#5686) sztanozs válasza MTbc (#5685) üzenetére


sztanozs
veterán

ugye nem faljokat taroltok binary blob-ban?

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#5687) nyunyu válasza MTbc (#5685) üzenetére


nyunyu
félisten

Memory meg core limitek nem úgy értendőek, hogy tökmindegy, mennyi van a gépben, akkor is legfeljebb 4 magot, meg ~2GB RAMot használhat?
(Windows feladatkezelőben meg tudod nézni, hogy éppen mennyit használ.)

Ettől persze lényegesen lassabb lesz combosabb lekérdezéseknél, mint a fizetős SQL Serverek, amik a gépben lévő összes procihoz, RAMhoz hozzáférnek. (olcsóbbik Web edition 16 mag, 64GB RAM limites? Átlag asztali PCben nincs annyi.)

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5688) DopeBob válasza MTbc (#5685) üzenetére


DopeBob
addikt

Olyan minimalis terheles, hogy nem lesz vele gond. Nalunk 5x ennyi emberrel is vidaman fut. Db meretkorlattol is messze vagyunk, igaz eleve ugy terveztunk, hogy tobb Vault van. De maguk a fajlok nem is a db-ben vannak. Ha a sima free Vaultrol van szo, mi 10+ eve hasznaljuk az ingyenes sql szerverrel.

MZ/X

(#5689) user112


user112
senior tag

Sziasztok!
Egy ilyen táblából:
ID, month, country, value
szeretnék úgy szűrni ID-re, hogy az oszlopokban az összes olyan országkód bent legyen, ahol van érték adat, amit nem tudok előre:
month, country1, country2, country3, ...
Egy ID, egy hónapban többször előfordulhat, akárhány országkóddal.
Gyakorlatilag Pivot lenne, de nem ismerem előre az oszlopok értékét.
Köszönöm a segítséget. Oracle sql developer

(#5690) user112 válasza user112 (#5689) üzenetére


user112
senior tag

ID-re szűrve a havi összesen érték kellene, oszlopokban az előforduló országkódok.

(#5691) nyunyu válasza user112 (#5689) üzenetére


nyunyu
félisten

Grr, hülyeséget írtam.
PIVOT IN részébe nem lehet alselectet írni :(

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5692) Ispy válasza user112 (#5689) üzenetére


Ispy
veterán

Ha nem tudod az oszlopok számát nincs pivot. Ami marad az dinamikus sql, azaz csinálsz egy tárolt eljárást (nem tudom oracleben mi a neve) és rutint, ami összeszedi mi van az adott pillanatban és az alapján összeállít egy selectet.

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#5693) nyunyu válasza Ispy (#5692) üzenetére


nyunyu
félisten

Tarzan erős jeligére:
create table tabla (
ID number,
month number,
country char(2),
ertek number);

insert into tabla (ID, month, country, ertek)
values (1, 1, 'HU', 100);
insert into tabla (ID, month, country, ertek)
values (1, 2, 'HU', 200);
insert into tabla (ID, month, country, ertek)
values (1, 3, 'HU', 300);
insert into tabla (ID, month, country, ertek)
values (1, 1, 'AT', 50);
insert into tabla (ID, month, country, ertek)
values (1, 3, 'AT', 500);
insert into tabla (ID, month, country, ertek)
values (1, 1, 'DE', 100);
insert into tabla (ID, month, country, ertek)
values (1, 2, 'DE', 1000);

commit;

declare
v_orszagkod varchar2(4000);
v_sql varchar2(4000);
begin
select listagg('''' || country || '''', ', ')
within group (order by country)
into v_orszagkod
from (select distinct country from tabla);

--dbms_output.put_line(v_orszagkod);

v_sql := 'create table pivot_table as' || chr(13) || chr(10) ||
'select *' || chr(13) || chr(10) ||
'from tabla' || chr(13) || chr(10) ||
'PIVOT (' || chr(13) || chr(10) ||
' SUM(ertek)' || chr(13) || chr(10) ||
' FOR country' || chr(13) || chr(10) ||
' IN (' || v_orszagkod || ')' || chr(13) || chr(10) ||
')' || chr(13) || chr(10) ||
'where ID = 1' || chr(13) || chr(10) ||
'order by month';

--dbms_output.put_line(v_sql);

execute immediate v_sql;
end;

select *
from pivot_table;

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5694) martonx válasza Ispy (#5692) üzenetére


martonx
veterán

Ilyenkor jön a dinamikusan összerakott pivot, némi string mágiával, vagy ahogy nyunyu mutatja.

Én kérek elnézést!

(#5695) Ispy válasza martonx (#5694) üzenetére


Ispy
veterán

Igen, erre gondoltam, csak félreérthető volt.

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#5696) nyunyu


nyunyu
félisten

Alapjáraton utálom a dinamikus SQLt, pláne még ha debugolni is kell.
Az meg az extra perverzióm, hogy a dinamikusan összerakott string is olvasható maradjon, azért van benne az a sok CR-LF összefűzés benne.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5697) Ispy válasza nyunyu (#5696) üzenetére


Ispy
veterán

Hasznos tud az lenni, nekünk van egy rakat, ami mindenféle sql-eket rak össze futásidőben, így sokkal kényelmesebb a kódolás.

Tesztelni könnyű, debug.print, ha már annyi sortörés van benne. ;]

ms sql debuggálása egyébként is egy kőbalta, szóval tökmind1

[ Szerkesztve ]

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#5698) nyunyu válasza Ispy (#5697) üzenetére


nyunyu
félisten

Szerintem nem akarod tudni, hogyan generáltam dinamikus SQLlel másik dinamikus SQLt, ami generálta helyettem a végleges kódot, ami ~500 táblából vasvillával hányja ki a GDPR érett ügyfelek összes kapcsolódó rekordját.

(Nem volt kedvem kézzel végignyálazni a foreign keyeket, plusz megírni a szükséges joinokat.)

Hello IT! Have you tried turning it off and on again?

(#5699) Ispy válasza nyunyu (#5698) üzenetére


Ispy
veterán

Én? Én már semmit nem akarok tudni. ;]

"Debugging is like being the detective in a crime movie where you're also the murderer."

(#5700) user112


user112
senior tag

Köszönöm a segítséget!

Útvonal

Fórumok  »  Szoftverfejlesztés  »  SQL kérdések (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.