Filtrowanie danych w SQL

0

Mam dane w bazie accessa w takim układzie:
konto data saldo
x 2005-01-03 500
x 2005-01-25 400
x 2005-02-06 200
y 2005-01-03 50
y 2005-01-05 40
y 2005-01-09 200
y 2005-01-23 700
y 2005-02-25 100
y 2005-02-28 600

Data np. dla konta x 2005-01-03 oznacza, że tego dnia powstało na tym koncie saldo 500 i jest one cały czas aż do dnia 2005-01-24 bo 2005-01-25 jest już 400 itd. Chcę wyciągnąć z bazy salda obowiązujące dla kont na dany dzień np. 2005-01-31. Wynik powinien wyglądać tak:
x 400
y 700
Niestety nie bardzo wiem jak to osiągnąć. Czy to można zrobić jednym zapytaniem SQL, czy trzeba stworzyć jakąś bazę tymczasową gdzie są łądowane interesujące mnie dane a potem z nich raport? Baza jest duża ponad 100 tys. rekordów. Docelowo przesiądę się na MSDE ale na razie chodzi o samo rozwiązanie jak to zrobić

0

SQL powiadasz? :0

SELECT konto, data, saldo FROM nazwa_tabeli WHERE data = '2005-01-31'

nie wiem jak sie robi zapytania w accesie, ale w kazdym innym SQL'u takie coś przejdzie

0
Kooba napisał(a)

SQL powiadasz? :0

SELECT konto, data, saldo FROM nazwa_tabeli WHERE data = '2005-01-31'

nie wiem jak sie robi zapytania w accesie, ale w kazdym innym SQL'u takie coś przejdzie

He, he, he. Dobre. Chyba chciales napisac w MySql'u.

0
maniek_2 napisał(a)

He, he, he. Dobre. Chyba chciales napisac w MySql'u.
He, he, he. Dobre. :| Chyba jednak nie chciał.
MySQL to specyficzna baza danych - SQL to język zapytań.

0
Kooba napisał(a)

SQL powiadasz? :0

SELECT konto, data, saldo FROM nazwa_tabeli WHERE data = '2005-01-31'

nie wiem jak sie robi zapytania w accesie, ale w kazdym innym SQL'u takie coś przejdzie

Może mi sie wydaje ale w ten sposób skonstruowane zapytanie w podanym przykładzie nic nie zwróci w wyniku, bowiem w bazie nie ma żadnego wpisu z dniem 2005-01-31 czyż nie?

0
Piotr napisał(a)
Kooba napisał(a)

SQL powiadasz? :0

SELECT konto, data, saldo FROM nazwa_tabeli WHERE data = '2005-01-31'

nie wiem jak sie robi zapytania w accesie, ale w kazdym innym SQL'u takie coś przejdzie

Może mi sie wydaje ale w ten sposób skonstruowane zapytanie w podanym przykładzie nic nie zwróci w wyniku, bowiem w bazie nie ma żadnego wpisu z dniem 2005-01-31 czyż nie?

to jest przykład, kilka cyferek chyba sam możesz zmienić

0

Cały problem właśnie w tych cyferkach. W przykładzie chodzi o wyciągniecie salda dla daty 2005-01-31, a tej daty wprost nie ma wpisanej w bazie

0

Jeżeli dobrze zrozumiałem problem to chyba coś takiego powinno zadziałać.

SELECT ID, konto as kont, data, saldo FROM nazwa_tabeli
HAVING data = (SELECT DISTINCT max(data) FROM nazwa_tabeli WHERE konto = kont AND Data < '2005-01-31' GROUP BY konto)
0

Niestety wywala błedem że konto nie zawiera się funkcji agregującej lub order by.
Wpisałem same podzapytanie i otrzymałe wynik prawie taki o jaki chodzi:

SELECT DISTING Konto, max(data) as data
from tabela where data <='2005-01-31'
group by konto

Brakuje już tylko kolumny saldo. Nie wiem jak ją dodać żeby była wyświetlana w wyniku. Gdy ją ujmę w Select to wyrzuca bład, że chce żeby była w order by (a przecież tam nie może być)

0

Dziwne, u mnie normalnie tamto zapytanie się wykonuje. (MySQL Server 4.1)
W takim razie spróbuj tego

SELECT Konto,
(SELECT max(Data) FROM nazwa_tabeli b WHERE a.Konto = b.Konto AND b.Data < '2005-01-31' ) as Data,
(SELECT saldo FROM nazwa_tabeli c WHERE a.Konto = c.Konto  AND c.Data < '2005-01-31' ORDER BY c.Data DESC LIMIT 1) as Data
FROM nazwa_tabeli a
GROUP BY Konto

A jeżeli nie potrzebujesz w wyniku kolumny data to można to jedno podzapytanie wywalić

 SELECT Konto,
(SELECT saldo FROM nazwa_tabeli c WHERE a.Konto = c.Konto  AND c.Data < '2005-01-31' ORDER BY c.Data DESC LIMIT 1) as Data
FROM nazwa_tabeli a
GROUP BY Konto
0

Używam MSDE 2000. Obawiam że nie obsługuje opcji LIMIT. Zainstaluję MySql i zobaczę co wyjdzie

0

Moze to zadziała

 SELECT Konto,
(SELECT FIRST(saldo) FROM nazwa_tabeli c WHERE a.Konto = c.Konto  AND c.Data < '2005-01-31' ORDER BY c.Data DESC) as Data
FROM nazwa_tabeli a
GROUP BY Konto

funkcja FIRST jest w MS Access, nie ma jej w MySQL

0

niestety nie. Zobacze na Mysql

0

Testowałem na tabeli salda o kolumnach: konto, data, saldo
więc moze tak, zrób sobie kwerende:

SELECT konto, b.data AS d1, (SELECT
         MIN(Data)
      FROM
        salda a
      WHERE
         a.Data > b.Data
    ) - 1 AS d2, saldo
FROM salda AS b
ORDER BY b.konto, b.data;

i zapisz jako saldookresy

a później możesz to wybrać zapytaniem:

SELECT saldookresy.konto, saldookresy.saldo, saldookresy.d1, CVDate([saldookresy].[d2]) AS D2
FROM saldookresy
WHERE (((saldookresy.d1)<=#1/12/2005#) AND ((CVDate([saldookresy].[d2]))>=#1/12/2005#));

Problem pojawi się gdy będziesz miał datę w otartym okresie, ale z nie mam czasu teraz z tym walczyć

0
Gorion napisał(a)

Jeżeli dobrze zrozumiałem problem to chyba coś takiego powinno zadziałać.

SELECT ID, konto as kont, data, saldo FROM nazwa_tabeli
HAVING data = (SELECT DISTINCT max(data) FROM nazwa_tabeli WHERE konto = kont AND Data < '2005-01-31' GROUP BY konto)

Miałeś racje. Działa idealnie, ale na MySQL. Wreszcie udało mi się go zainstalować. Wynik jest taki o jaki mi chodzi. Mam jeszcze mały problem z połączeniem sie z MySql. Udało mi sie dopiero na komponentach z myDAC, ale te są płatne. Nie udaje się to natomiast przez dbepress. Domyslam się że obsługują one MySQl ale tylko do wersji 4.0, a ja mam 4.1. A może się mylę? Udało się to komuś zrobić? A może za pomocą czegoś innego darmowego można się podłaczyć?
(delphi 7 prof i MySQl 4.1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1