ďťż
 
pewnie proste, ale .. ďťż
 
pewnie proste, ale ..
Zobacz wiadomości
 
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
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

pewnie proste, ale ..



S.Lewandowski - 05-04-2006 00:04
pewnie proste, ale ..
  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.

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

pzdr
boddan

--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/




=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 06-04-2006 00:13

  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

Pozdrawiam
Grzegorz

Ps. Nie testowane, więc może coś pokręciłem.




=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 06-04-2006 00:13

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

Pozdrawiam
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    =?ISO-8859-2?Q?[mysql]_Nie_potrafi=EA_zgrupowa=E6_selecta_(proste)?= [MySQL] Proste pytanie z wyciągnięciem czasu, a jednak mnie zagieło. Skonstruowanie zapytania SQL do bazy Access - chyba proste Poszukuje codera do prostej aplikacji PHP/ MySQL proste pytanie na temat =?ISO-8859-2?Q?Servlet=F3w?= [postgresql] jak sie do takich danych dobrac (proste?) Jak to proste zapytanie wygladałoby w MS SQL ? Corel - zaznaczanie przesuwanie; proste pytania Proste pytanie - jak podzielic sciezke w Corelu? Hierarchia agregacja [MS SQL]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lunadance.htw.pl
  • Cytat

    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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com