Problem z zapytaniem

0

Nie znam dobrze SQL'a. Muszę wykonać "dziwne" zapytanie i nie za bardzo wiem jak to zrobić i czy istnieje taka możliwość. Postaram się trochę uprościć sprawę. Mam 2 tabele. Jedna przechowuje id usera, nazwę i kilka innych danych. Druga tabela zawiera punkty. Nie ważne jakie ;) Tabela składa się z id, id usera, wartości, czasu i opisu. Chodzi o to, żeby wybrać z pierwszej tabeli nazwę usera, natomiast z drugiej wybrać ilość zdobytych punktów z 3 ostatnich miesięcy (osobno za każdy), tak aby w wyniku były podawane jako osobne kolumny. Dla uproszczenia przyjmuję, że 1 miesiąc trwa od c1, 2 miesiąc jest pomiędzy c1 a c2 itd.

W Skrócie:

tabela1
ID | Username | ...
tabela2
ID | User_ID | Czas (unixowy) | Wartość | Opis

Wynik:
Nick1 WynikW1Miesiącu WynikW2Miesiącu WynikW3Miesiącu (chodzi o 3 ostatnie miesiące)
Nick2 WynikW1Miesiącu WynikW2Miesiącu WynikW3Miesiącu
...

Wiem, że wygląda to, jakbym chciał, żebyście odwalili za mnie brudną robotę ale pojęcia nie mam co z tym zrobić. Kombinowałem wczoraj cały dzień i nic ;(

0

Nie podales jaki serwer bazy. Tak na szybko to np. w mssql wygladaloby to jakos tak:

select t1.nick, 
  (select count(punkty) from t2 where userid=t1.id and data > DATEADD('d', -1,getdate()) ),
  (select count(punkty) from t2 where userid=t1.id and data between DATEADD('d', -1,getdate()) and DATEADD('d', -2,getdate()) ),
  (select count(punkty) from t2 where userid=t1.id and data between DATEADD('d', -2,getdate()) and DATEADD('d', -3,getdate()))
from t1

Niestety az 3 podzapytania. Lepiej byloby wykorzystac grupowanie, ale wtedy wyniki beda nieco inaczej wygladaly:

select t1.nick, count(t2.punkty) 
from tabela1 t1 inner join tabela2.t2 on t1.nick=t2.userid 
where t1.data > DATEADD('d', -3,getdate()) 
group by t1.nick, year(t2.data), month(t2.data) 
order by t1.nick, year(t2.data), month(t2.data)

Powyzsze powinno byc duzo szybsze od pierwszego

Przykladowe wyniki to:
Nick1 Punkty //pierwszy miesiac
Nick1 Punkty //drugi miesiac
Nick1 Punkty //trzeci miesiac
Nick2 Punkty
Nick2 Punkty
Nick2 Punkty

0

Witam,

zapytania @johny_bravo sa dobre tylko nalezaloby poprawic drobne rzeczy:

-zamiast count powinno byc raczej sum
-w funkcji dateadd pierwszy parametr ma byc "m" a nie "d" (m-month, d-day)

Druga sprawa to to czy pod pojeciem 'ostatni miesiac' rozumiesz date z dokladnoscia co do dnia czy do miesiaca. Uzywajac f-cji dateadd("m",-1,getdate()) otrzymasz okres z ostatniego miesiaca liczac od dzisiaj (czyli od 27.06.2007).
Jezeli chcialbys uzyskac punkty zdobyte w calym czerwcu to uzyj:
select .... from... where month(data)=month(getdate())-1

0

@WAT: slusznie, slusznie, sam widzisz o ktorej godzinie to pisalem :P Co do miesiaca to masz racje i jej nie masz. Nie mozna month(data)=month(getdate())-1, bo w przypadku, gdy aktualnym miesiacem jest styczen, to zapytanie pada... Po drugie zapytanie braloby pod uwage takie same miesiace z wszystkich lat. Ale mozna tak:

where month(data)=month(dateadd('m', -1, getdate()) and year(data) = year((dateadd('m', -1, getdate()))

czyli caly poprzedni miesiac.

0

No teraz musi juz wszystko grac ;)

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