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