Witam, piszę aplikację do obsługi pewnych targów. I klient zażyczył sobie na koniec jeszcze jednego raportu. Udało mi się napisać zapytanie, które jednak nie do końca pokazuje to, co pokazać powinno. Nie mogę sobie dać z tym rady.
Chodzi o to. Zwiedzający są dzieleni na różne grupy: VIP, media, gość, itp.
Na targach odbędzie się ileś pokazów i chodzi o to, aby wyświetlić raport, który pokaże ile vipów, mediów itd. było obecnych na każdym z pokazów. Niby proste... Ale ;)
- Zwiedzający otrzymują przy wejściu kartę z numerem, lub karty.
- Jeden zwiedzający może mieć kilka kart
- Każda karta może mieć różne uprawnienia(np. wejście do VipRoomu, wejście na konkretny pokaz)
Baza wygląda następująco(przedstawiam tylko interesujące dane):
EVENTS(ID, name) - tabela z pokazami
CARDS(ID, cardNo) - tabela z kartami
ENTRIES(ID, cardID, eventID, entryDate) - tabela przechowuje dane mówiące o tym, kto wszedł na który pokaz o której godzinie. Ściślej - jaka karta "weszła"
GUEST_TYPES(ID, name) - tabela słownikowa przechowująca typy zwiedzających(VIP, media, gość, itd)
GUESTS(ID, name, guestType) - tabela przechowująca zarejestrowanych zwiedzających
GUESTS_CARDS(ID, guestID, cardID) - tabela realizująca relację wiele do wielu
Co zwraca moje zapytanie.
Ano, listę wszystkich pokazów, obok tylko te typy gości, które weszły, lub null i ilość. np:
Pokaz 1 | Media | 2
Pokaz 1 | VIP | 3
Pokaz 2 | null | 0
Zakładając, że są 3 typy gości: VIP, media i gość, chciałbym, aby to zapytanie zwróciło:
Pokaz 1 | Media | 2
Pokaz 1 | VIP | 3
Pokaz 1 | Gość | 0
Pokaz 2 | Media | 0
Pokaz 2 | VIP | 0
Pokaz 2 | Gość | 0
Próbowałem pobierać z tabeli guestTypes, a także próbowałem guestTypes łączyć za pomocą CROSS joina, ale nie przyniosło to wymaganych rezultatów.
Moje zapytanie wygląda następująco:
select ev.name, gt.name, count(en.ID)
from events ev
left join entries en on en.eventID = ev.ID
left join cards c on c.ID = en.cardID
left join guests_cards gc on gc.cardID = c.ID
left join guests g on g.ID = gc.guestID
left join guestTypes gt on gt.ID = g.guestType
group by ev.name, gt.name
order by ev.name
Nic lepszego nie mogę napisaćl.