» »

[SQL] dvojni klic potratne funkcije?

[SQL] dvojni klic potratne funkcije?

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:
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

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.
Ü

Looooooka ::

Zakaj pa lepo teh dveh vrstic ne napišeš skupaj?
Kje si dobil potrebo po uporabi spremenljivke :D

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

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!

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)

Zgodovina sprememb…

  • spremenil: vorantz ()

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

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 :)
Your turn to burn!

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

lizard14 ::

zaposleni: ID, Ime
plača se računa iz podatkov iz ca. 10 tabel + še nekaj formul (if, else...) je vmes.

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


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Učenje programiranja PHP

Oddelek: Programiranje
91497 (1038) Spura
»

PostgreSQL pomoč

Oddelek: Programiranje
162522 (2015) Mato989
»

[SQL] teževa pri iskanju zapisov

Oddelek: Programiranje
102115 (1705) lopow
»

[SQL] - združitev glede na iste vrednosti

Oddelek: Programiranje
131414 (1056) tx-z
»

[Java] Evidenca delovnega časa - Java v navezi z Accessom

Oddelek: Programiranje
393295 (2515) c0dehunter

Več podobnih tem