Uživatelská funce v SQL

HackForum

Uživatelská funce v SQL#
Ahojte, potřeboval bych pomoci s uživatelskou funkcí pro SQL. (T-SQL)

Popis: Mám dvě tabulky:

První z nich obsahuje aktuální stav
idzbozi | stav
10000 7

Druhá tabulka jednotlivé pohyby
idzbozi | idpohybu | pohyb
10000 1 -2
10000 2 -4
10000 3 +50
10000 4 -20
10000 5 -30
10000 6 -15
10000 7 +40
10000 8 -24

Mým cílem je vytvořit funkci, která vrátí idpohybu, při kterém dojde k poklesu stavu na zápornou hodnotu. Tzn. že od aktuálního stavu bude postupně odečítat (přičítat) jednotlivé pohyby.

V uvedeném případě by tedy funkce vrátila idpohybu 6, protože 7 - 2 - 4 + 50 -20 -30 -15 = -14

V současné době to řeším přes dočasnou tabulku, která je rozšířena o sloupec s mezivýsledkem, a kterou naplňuji řádek po řádku a dopočítávám stav.
Nakonec pak z této tabulky vyberu první řádek se záporným mezivýsledkem. Při velkém množství dat, je ale tento způsob děsně pomalý a tak by mě zajímalo, jak byste tuto funkci řešili vy.

Díky.

----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP12.4.2011 9:47
re: Uživatelská funce v SQL#
Možná než funkce by byl lepší pohled, který by obsahoval dopočítaný sloupec s aktuálním stavem. Je to vůbec možné nějak reálně vytvořit?

----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP12.4.2011 12:05
re: Uživatelská funce v SQL#
no a nemůžeš použít cyklus (for) v SQL? na MS SQL serveru by měl být.. a prostě loopovat dokud hodnota neni pod 0. Ale možná to chápu uplně blbě

----------
chacha
(odpovědět)
gdi13.4.2011 14:54
re: Uživatelská funce v SQL#
gdi: jo slo, podobne to i delam. Kdyz to ale potrebujes udelat u tisice polozek, tak si na vysledek nejakou dobu pockas a to se mi nelibi :) Prave kvuli rychlosti bych se chtel cyklum vyhnout, ale nevim, jestli je to realne.

----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP13.4.2011 15:16
re: Uživatelská funce v SQL#
no ale nepotrebujes pomocnou tabulku

a jak casto se tabulka s pohyby mění?

----------
chacha
(odpovědět)
gdi13.4.2011 16:19
re: Uživatelská funce v SQL#
[link]
Nic rychlejšího už mě nenapadlo.

----------
Sec-Cave.cz - [link]
(odpovědět)
RubberDuck | E-mail | Website13.4.2011 15:38
re: Uživatelská funce v SQL#
když tam ale dáš tabulku jakou napsal cumin s 8 ruznými pohyby tak to už nepujde ne?

----------
chacha
(odpovědět)
gdi13.4.2011 16:20
re: Uživatelská funce v SQL#
Pokud to funguje se šesti pohyby, proč by to nemělo fungovat se sedmi? Právě proto jsem tam hodil výpisy z tabulek, aby bylo vidět, že jsem si to nevycucal z prstu. Jednoduše, uděláš jeden SELECT abys získal sumu všech pohybů k danému produktu a výsledek přičteš k základu daného produktu.

----------
Sec-Cave.cz - [link]
(odpovědět)
RubberDuck | E-mail | Website13.4.2011 16:38
re: Uživatelská funce v SQL#
ale on chce vědět, který pohyb dostal zboží do záporných hodnot.. Pokud bys měl 9 pohybů a vyšlo ti -60, tak víš prd kterej byl ten rozhodující.

----------
chacha
(odpovědět)
gdi13.4.2011 16:44
re: Uživatelská funce v SQL#
Ah! Sry. Špatně jsem četl. Tuhle informaci jsem nějak úplně vypustil.

----------
Sec-Cave.cz - [link]
(odpovědět)
RubberDuck | E-mail | Website13.4.2011 17:04
re: Uživatelská funce v SQL#
Ono by to šlo udělat heuristikou. Ale nevím, kolik času bys tímhle zachránil. Řekl bych že by to moc nebylo. Nakonec bude asi vážně nejlepší použít nějakou pomocnou tabulku s mezivýpočtem.

----------
Sec-Cave.cz - [link]
(odpovědět)
RubberDuck | E-mail | Website13.4.2011 17:21
re: Uživatelská funce v SQL#
OK, děkuji všem.

----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP13.4.2011 20:09
re: Uživatelská funce v SQL#
Tak nakonec vyřešeno doplněním sloupce se součtem všech pohybů uvedených "před". Pokud se jakýkoliv pohyb změní, jednoduše tento sloupec přepočítám příkazem:

update pohyby
set mnspoctene=(
select isnull(sum(temp.mnpohyb),0)
from pohyby temp
where
temp.idpohybu <= pohyby.idpohybu and
temp.idzbozi = pohyby.idzbozi)

Pokud pak chci získat id s mínusovým stavem, stačí jednouchej dotaz:

select top 1 idpohybu
from pohyby
where stav-mnspoctene < 0
order by idpohybu

Je to mnohonásobně rychlejší než při postupném načítání.

----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP15.4.2011 8:02
re: Uživatelská funce v SQL#
přesně toto mne napadlo a proto jsem se ptal jak často se pohyby mění.. :D

----------
chacha
(odpovědět)
gdi15.4.2011 14:19

Zpět
Svou ideální brigádu na léto najdete na webu Ideální brigáda
 
 
 

 
BBCode