| 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) | |
|
|
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) | |
|
|
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) | |
|
|
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) | |
|
|
re: Uživatelská funce v SQL | # |
| no ale nepotrebujes pomocnou tabulku
a jak casto se tabulka s pohyby mění?
----------
chacha (odpovědět) | |
|
|
|
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) | |
|
|
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) | |
|
|
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) | |
|
|
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) | |
|
|
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) | |
|
|
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) | |
|
|
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) | |
|
|
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) | |
|
|