Forum » Programiranje » [SQL] dvojni klic potratne funkcije?
[SQL] dvojni klic potratne funkcije?
![](https://static.slo-tech.com/stili/avatar_gray.gif)
lizard14 ::
Pozdrav,
imam mysql stored funkcijo za izračun plače, ki je časovno potratna.
Rad bi prikazoval razmerje plačaPosameznika/povprečnaPlača za vsakega zaposlenega.
Postopam:
Je kakšna rešitev, da se funkcija ne bi vršila 2x (prvič ob izračunu povprečne plače vseh + drugič za vsakega zaposlenega)?
Želim izpis v obliki:
ID, IME, RAZMERJE
imam mysql stored funkcijo za izračun plače, ki je časovno potratna.
Rad bi prikazoval razmerje plačaPosameznika/povprečnaPlača za vsakega zaposlenega.
Postopam:
SET @povprecnaPlaca = SELECT SUM(potratnaFunkcijaZaIzračunPlačeZaposlenega(id)) from zaposleni;
SELECT ID, IME, potratnaFunkcijaZaIzračunPlačeZaposlenega(id) / @povprecnaPlaca FROM zaposleni
Je kakšna rešitev, da se funkcija ne bi vršila 2x (prvič ob izračunu povprečne plače vseh + drugič za vsakega zaposlenega)?
Želim izpis v obliki:
ID, IME, RAZMERJE
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Roadkill ::
Ker se plače ne spreminajo v realnem času, bi jaz dnevno ganjal tvojo požrešno funkcijo in z njo filal eno tabelo.
S tako tabelo bi lahko dobil tudi vpogled v spreminjanje plače skozi čas.
S tako tabelo bi lahko dobil tudi vpogled v spreminjanje plače skozi čas.
Ü
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Looooooka ::
Zakaj pa lepo teh dveh vrstic ne napišeš skupaj?
Kje si dobil potrebo po uporabi spremenljivke :D
Kje si dobil potrebo po uporabi spremenljivke :D
![](https://static.slo-tech.com/stili/avatar_gray.gif)
joze67 ::
Ne poznam sicer MySQL, ampak če ima na voljo začasne tabele, lahko obrneš vrstni red
SELECT into #1 ID, IME, potratnaFunkcijaZaIzračunPlačeZaposlenega(id) Placa FROM zaposleni SET @PovPlaca = AVERAGE(Placa) from #1 SELECT ID, IME, Placa/@PovPlaca from #1
![](https://static.slo-tech.com/stili/bel_non_grata.png)
Mesar ::
Če misliš CREATE VIEW http://www.w3schools.com/sql/sql_view.a... je (preverjeno) podprt v MySQL, M$SQL in Oracle.
Your turn to burn!
![](https://static.slo-tech.com/stili/avatar_gray.gif)
vorantz ::
raje napiši vsebino te potratne funkcije
sem sicer bol doma v mssql ampak zihr se da stvar prepisat tako, da sploh ne rabiš funkcije v selectu (ki se jo je treba izogibat kot hudič križa, če imaš veliko podatkov)
sem sicer bol doma v mssql ampak zihr se da stvar prepisat tako, da sploh ne rabiš funkcije v selectu (ki se jo je treba izogibat kot hudič križa, če imaš veliko podatkov)
Zgodovina sprememb…
- spremenil: vorantz ()
![](https://static.slo-tech.com/stili/bel_non_grata.png)
Invictus ::
Lahko gnezdiš SELECT stavke ... pa boš imel samo en query. Brez funkcije.
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
![](https://static.slo-tech.com/stili/bel_non_grata.png)
Mesar ::
Za "plačaPosameznika/povprečnaPlača" je verjetno že tisti SQL ki ga ima zdaj FAIL.
V povprečno plačo sešteješ vse plače in jih deliš z številom plač, pa to shraniš enx dnevno recimo... funkcijo za izračun povprečne plače posameznega zaposlenega pa odvisno kako imaš shranjene podatke, načeloma lahko v MySQL LEFT JOINaš SUM, ki ga nato deliš s številom plač, če imaš v eni tabelci zaposlene in v drugi njihove plače z IDjem zaposlenega seveda - tu lahko imaš kar nekaj podatkov pa se zadeve še izvršujejo v znosnih časih. Recimo, da maš za vsakega zaposlenega plače za nazaj za 10 let je to 120 vrstic na zaposlenega, nebi smelo bit problem
V povprečno plačo sešteješ vse plače in jih deliš z številom plač, pa to shraniš enx dnevno recimo... funkcijo za izračun povprečne plače posameznega zaposlenega pa odvisno kako imaš shranjene podatke, načeloma lahko v MySQL LEFT JOINaš SUM, ki ga nato deliš s številom plač, če imaš v eni tabelci zaposlene in v drugi njihove plače z IDjem zaposlenega seveda - tu lahko imaš kar nekaj podatkov pa se zadeve še izvršujejo v znosnih časih. Recimo, da maš za vsakega zaposlenega plače za nazaj za 10 let je to 120 vrstic na zaposlenega, nebi smelo bit problem
![:)](https://static.slo-tech.com/smeski/icon_smile.gif)
Your turn to burn!
![](https://static.slo-tech.com/stili/avatar_gray.gif)
prozac ::
a lahko bolj natančno napišeš kako mas shranjene zaposlene in podatke o zaposlenih - tabele in polja
potem bi lahko malo več povedali ali je funkcija sploh potrebna ali bi se vse naredilo kar v SQL, ki deluje dosti hitreje mogoče kaka analitična funkcija
sum() over (partition by .... order by...). Vse podatke bi pripravil v view, potem pa eno ful preprosto procedurco
insert into table (....) as select .... from view
in potem imaš shranjene podatke v tabeli (če rabiš podatke v trenutku) ali v kakem materializiran view ali pa samo v view, če ti bo delal dovolj hitro
potem bi lahko malo več povedali ali je funkcija sploh potrebna ali bi se vse naredilo kar v SQL, ki deluje dosti hitreje mogoče kaka analitična funkcija
sum() over (partition by .... order by...). Vse podatke bi pripravil v view, potem pa eno ful preprosto procedurco
insert into table (....) as select .... from view
in potem imaš shranjene podatke v tabeli (če rabiš podatke v trenutku) ali v kakem materializiran view ali pa samo v view, če ti bo delal dovolj hitro
![](https://static.slo-tech.com/stili/avatar_gray.gif)
lizard14 ::
zaposleni: ID, Ime
plača se računa iz podatkov iz ca. 10 tabel + še nekaj formul (if, else...) je vmes.
plača se računa iz podatkov iz ca. 10 tabel + še nekaj formul (if, else...) je vmes.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
prozac ::
mysql ne poznam kaj dosti. Poznam pa Oracle. V njem imaš vgrajene analitične funkcije in window funkcije.
Jaz bi se v teoriji lotil zadeve tako, da bi iz 10ih tabel najprej sfiltriral samo podatke, ki jih dejansko rabiš (vse ostalo odstrani, ker ti po nepotrebnem kuri resurse).
Nato bi v enem selectu izračunal:
- plačo posameznika z uporabo funkcije sum(placa) over (partition by delavec, datum)
- plačo vseh zaposlenih pa z sum(placa) ... group by datum
Nato v zunanjem selectu izračunaš razmerje. Nekaj takega se da narediti v Oraclu - ne vem pa ali to omogoča tudi mysql
Jaz bi se v teoriji lotil zadeve tako, da bi iz 10ih tabel najprej sfiltriral samo podatke, ki jih dejansko rabiš (vse ostalo odstrani, ker ti po nepotrebnem kuri resurse).
Nato bi v enem selectu izračunal:
- plačo posameznika z uporabo funkcije sum(placa) over (partition by delavec, datum)
- plačo vseh zaposlenih pa z sum(placa) ... group by datum
Nato v zunanjem selectu izračunaš razmerje. Nekaj takega se da narediti v Oraclu - ne vem pa ali to omogoča tudi mysql
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Učenje programiranja PHPOddelek: Programiranje | 1440 (981) | Spura |
» | PostgreSQL pomočOddelek: Programiranje | 2471 (1964) | Mato989 |
» | [SQL] teževa pri iskanju zapisovOddelek: Programiranje | 2062 (1652) | lopow |
» | [SQL] - združitev glede na iste vrednostiOddelek: Programiranje | 1352 (994) | tx-z |
» | [Java] Evidenca delovnega časa - Java v navezi z AccessomOddelek: Programiranje | 3246 (2466) | c0dehunter |