Mój model wygląda następująco:
- Firma ma N lokalizacji.
- Lokalizacja ma N transakcji.
- Każda transakcja ma klienta.
- Każda transakcja należy do grupy transakcji.
Jak napisać zapytanie, że znajduje wszystkich klientów, którzy mają co najmniej K grup transakcji w określonej firmie, gdzie K jest liczbą całkowitą? (Chcę, żeby wynik zawierał danego klienta nie więcej niż raz.)
Odpowiedzi:
4 dla odpowiedzi № 1Posługiwać się having
!
select
c.CustomerID,
count(distinct tg.TransactionGroupID) as GroupCount
from
Customers c
inner join Transaction t on
c.CustomerID = t.CustomerID
inner join Location l on
t.LocationID = l.LocationID
inner join Business b on
l.BusinessID = b.BusinessID
inner join TransactionGroup tg on
t.TransactionGroupID = tg.TransactionGroupID
where
b.BusinessName = "Some business"
group by c.CustomerID
having count(distinct tg.TransactionGroupID) > 4
Jeśli nie potrzebujesz informacji o grupie transakcji, możesz po prostu dołączyć do tabeli transakcji i zrezygnować z drugiego łączenia.
Użyłem tutaj „4”, ale możesz użyć parametru lub innej liczby całkowitej, która Ci odpowiada.
1 dla odpowiedzi nr 2
SELECT Customerid
From Transaction t
INNER JOIN TransactionGroup tg
ON t.transactionid = tg.transactionid
GROUP BY Customerid
HAVING COUNT(DISTINCT TransactionGroup) => @TransactionCountDesired
To jest sedno, może być konieczne rozszerzenie JOIN
s dalej.
Tak długo jak ty GROUP BY
klienta i mieć COUNT(DISTINCT...)
dla Twojego HAVING
sprawdź liczbę grup transakcji, z którymi nie będziesz miał do czynienia z oszustami.