Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
potrzebuję wyciągnąć 'wartosc' dla danego miesiaca i roku, ale jesli nie wystepuje, to ma zwrócić wartość najbliższej daty wstecz, czyli np. dla 2-2003 ma zwrócić 10, dla 6-2003 5 itd. Jak to zapisać, bo WHERE rok<=szukany_rok AND miesiac<= szukany_miesiac ORDER BY id DESC LIMIT 1 rzecz jasna nie zadziała tak jak ma, bo np. wywala się na 11-2005.
Pzdr.
Wojtek pBT (prac) - 06-04-2006 00:13
S.Lewandowski napisał(a): > no właśnie, ale .. nie wiem jak to ugryźć :) > Jest tabela: > > id (int) | miesiac (int) | rok (int) | wartosc (int) > -------------------------------------- > 1 | 1 | 2003 | 10 > 2 | 5 | 2003 | 5 > 3 | 12 | 2004 | 15 >
bo sortuj po dacie:
SELECT wart FROM tab WHERE concat(rok,if(miesiac<10, concat('0',miesiac),miesiac) <= concat(szukany_rok,szukany_miesiac) ORDER BY rok DESC, miesiac DESC LIMIT 1;
przy czym szukany miesiąc ma być zawsze 2-cyfrowy, albo robisz en sam myk co z miesiącem z bazy
pBT
> Pzdr. > > pozdro
bogdan no - 06-04-2006 00:13
> Jest tabela: > > id (int) | miesiac (int) | rok (int) | wartosc (int) > -------------------------------------- > 1 | 1 | 2003 | 10 > 2 | 5 | 2003 | 5 > 3 | 12 | 2004 | 15 > > > potrzebuję wyciągnąć 'wartosc' dla danego miesiaca i roku, ale jesli nie > wystepuje, to ma zwrócić wartość najbliższej daty wstecz, czyli np. dla > 2-2003 ma zwrócić 10, dla 6-2003 5 itd. Jak to zapisać, bo WHERE > rok<=szukany_rok AND miesiac<= szukany_miesiac ORDER BY id DESC LIMIT 1 > rzecz jasna nie zadziała tak jak ma, bo np. wywala się na 11-2005.
cześć, nie wiem, o jaką bazę chodzi, w oraclu wyglądało by to tak: :p_miesiac - parametr miesiac :p_rok - parametr rok
select wartosc from tabela where to_char(miesiac||'-'||rok) = ( select max(to_char(miesiac||'-'||rok) from tabela where (to_char(miesiac||'- '||rok) < to_char(:p_miesiac||'-'||:p_rok) )
Innymi slowy musisz znalezc najwiekszą z dat ktora spelnia waruenek, ze jest mniejsza od daty_parametr
S.Lewandowski wrote: > id (int) | miesiac (int) | rok (int) | wartosc (int)
Ja bym zaczął od naprawienia modelu danych. Miesiąc to nie liczba całkowita. Rok też nie. Rok i miesiąc, to data. Do przechowywania dat jest specjalny typ. Gdybyś go użył, to nie musiałbyś w ogóle zadawać tego pytania, bo rozwiązanie byłoby oczywiste.
-- Michał Kuratczyk
S.Lewandowski - 06-04-2006 00:13
[...] > SELECT wart FROM tab > WHERE concat(rok,if(miesiac<10, concat('0',miesiac),miesiac) <= > concat(szukany_rok,szukany_miesiac) > ORDER BY rok DESC, miesiac DESC LIMIT 1; > > przy czym szukany miesiąc ma być zawsze 2-cyfrowy, albo robisz en sam > myk co z miesiącem z bazy >
Niestety, to zapytanie zwraca zawsze ostatni rekord, niezależnie od podanych wartości 'rok' i 'miesiac' :-/
S.Lewandowski - 06-04-2006 00:13
Użytkownik "Michał Kuratczyk" <kura@lj.pl> napisał w wiadomości news:e0vv1k$hfd$1@abg.com.pl... > S.Lewandowski wrote: > > id (int) | miesiac (int) | rok (int) | wartosc (int) > > Ja bym zaczął od naprawienia modelu danych. Miesiąc to nie liczba całkowita. > Rok też nie. Rok i miesiąc, to data. Do przechowywania dat jest specjalny > typ. Gdybyś go użył, to nie musiałbyś w ogóle zadawać tego pytania, bo > rozwiązanie byłoby oczywiste.
Jest to raczej niewykonalne, ponieważ jest to działający system (który nie ja projektowałem) i byłoby za dużo roboty ze zmianą struktury bazy + przepisywaniem wszystkich zapytań
Grzegorz Danowski - 06-04-2006 00:13
Użytkownik "S.Lewandowski" <s[ dot ]lewandowski@dobrynet.pl> napisał w wiadomości news:e0ut1o$2dp$1@atlantis.news.tpi.pl... > no właśnie, ale .. nie wiem jak to ugryźć :) > Jest tabela: > > id (int) | miesiac (int) | rok (int) | wartosc (int) > -------------------------------------- > 1 | 1 | 2003 | 10 > 2 | 5 | 2003 | 5 > 3 | 12 | 2004 | 15 > > > potrzebuję wyciągnąć 'wartosc' dla danego miesiaca i roku, ale jesli nie > wystepuje, to ma zwrócić wartość najbliższej daty wstecz, czyli np. dla > 2-2003 ma zwrócić 10, dla 6-2003 5 itd. Jak to zapisać, bo WHERE > rok<=szukany_rok AND miesiac<= szukany_miesiac ORDER BY id DESC LIMIT 1 > rzecz jasna nie zadziała tak jak ma, bo np. wywala się na 11-2005.
Select W.* From Wartosci As W Where (Select * From Wartosci As M Where (M.rok * 100 + M.miesiac) <= (szukany_rok * 100 + szukany_miesiac) Having Max(M.rok * 100 + M.miesiac) = (W.rok * 100 + W.miesiac))
Albo:
Select W.* From Wartosci As W Where (W.rok * 100 + W.miesiac) = (Select Max(M.rok * 100 + M.miesiac) From Wartosci As M Where (M.rok * 100 + M.miesiac) <= (szukany_rok * 100 + szukany_miesiac))
Jeśli dla kolejnych Id wartości roku/miesięcy są zawsze rosnące, to można nieco prościej (i pewnie szybciej):
Select W.* From Wartosci As W Where (Select * From Wartosci As M Where (M.rok * 100 + M.miesiac) <= (szukany_rok * 100 + szukany_miesiac) Having Max(M.Id) = W.Id)
Ewentualnei nieco zmodyfikowany pomysł Wojtka:
SELECT W.* FROM Wartosci As W WHERE (M.rok * 100 + M.miesiac) <= (szukany_rok * 100 + szukany_miesiac) ORDER BY rok DESC, miesiac DESC LIMIT 1
S.Lewandowski wrote: >> Ja bym zaczął od naprawienia modelu danych. > Jest to raczej niewykonalne, ponieważ jest to działający system (który nie > ja projektowałem) i byłoby za dużo roboty ze zmianą struktury bazy + > przepisywaniem wszystkich zapytań Błędy należy poprawiać. Jeśli odziedziczyłeś system z błędami, to teraz Twoja w tym głowa, żeby te błędy poprawiać. Ale jeśli się upierasz, to pewnie coś w tym stylu rozwiąże Twój problem (wersja dla Oracle, bo nie podałeś co to za baza):
select wart from (select wart from tabela where rok*100+miesiac <= szukany_rok*100+szukany_miesiac order by rok desc, miesiac desc) where rownum = 1
-- Michał Kuratczyk
S.Lewandowski - 06-04-2006 00:13
[...] > Błędy należy poprawiać. Jeśli odziedziczyłeś system z błędami, to teraz > Twoja w tym głowa, żeby te błędy poprawiać. Ale jeśli się upierasz, to > pewnie coś w tym stylu rozwiąże Twój problem (wersja dla Oracle, bo nie > podałeś co to za baza): > > select wart from > (select wart from tabela > where rok*100+miesiac <= szukany_rok*100+szukany_miesiac > order by rok desc, miesiac desc) > where rownum = 1
Chętnie bym to poprawił, ale taki system zapisywania daty występuję w ok 15 tabelach, całość chodzi na MySQL 5.0 + php, więc sam rozumiesz .. kopa roboty a czasu niewiele. Być może w przyszłości ...
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona