У меня две таблицы:

Заказчики:

id  FirstName   LastName    Age     City
----------------------------------------
1        Joey       Blue     40  Goddard
2       Barry      Bonds     50  Gaddard
3        Mike    Schmidt     60       KC
4       Steve      Jones     45 New York

Заказы :

OrderId  OrderDate              CustomerID  ProductID
-----------------------------------------------------
      1 2019-08-06 12:10:02.270          1          1
      2 2019-08-06 12:10:33.690          2          1
      3 2019-08-06 12:10:44.970          2          2
      4 2019-08-06 12:10:51.910          1          1
      5 2019-08-06 12:10:52.210          1          1
      6 2019-08-06 12:10:52.657          1          1
      7 2019-08-06 12:10:53.067          1          1
      8 2019-08-06 12:11:17.340          2          1
      9 2019-08-06 12:11:23.963          2          2
     10 2019-08-06 12:11:32.063          3          2
     11 2019-08-06 12:11:38.503          3          1
     12 2019-08-06 12:11:38.790          3          1
     15 2019-08-17 19:51:45.070          2          1
     16 2019-08-17 19:52:14.207          2          2
     17 2019-08-17 19:52:14.540          2          2
     18 2019-08-17 19:52:14.923          2          2
     19 2019-08-17 19:52:31.240          1          2
     20 2019-08-17 19:52:37.363          1          2
     21 2019-08-17 19:52:38.860          1          2
     22 2019-08-17 19:52:39.213          1          2
     23 2019-08-17 19:52:39.613          1          2
     24 2019-08-17 19:52:39.997          1          2
     25 2019-08-17 19:52:40.360          1          2

Я пытаюсь вернуть имя и номер заказа любого клиента для тех, у кого от 4 до 8 заказов.

Я могу присоединиться к столам и посчитать количество заказов, используя:

SELECT 
    Cu.FirstName, COUNT(Od.CustomerID) AS 'Customer Orders'
FROM
    Customer AS Cu
INNER JOIN 
    Orders AS Od ON Cu.id = Od.CustomerID
GROUP BY 
    Od.CustomerID, Cu.FirstName
ORDER BY 
    [Customer Orders] DESC

Который возвращает результат:

FirstName   Customer Orders
----------------------------
     Joey                12
    Barry                 8
    Mike                  3

Но я не могу заставить МЕЖДУ работать только возвращаться (поэтому я получаю только тех клиентов, у которых от 4 до 8 заказов (поэтому мой желаемый результат будет :)

FirstName   Customer Orders
---------------------------------
    Barry                 8
1
Stacey 17 Авг 2019 в 22:11

2 ответа

Лучший ответ

Вы можете использовать для фильтрации результат функции агрегации

SELECT Cu.FirstName,COUNT(Od.CustomerID) as 'Customer Orders'
from Customer as Cu
inner join Orders as Od on Cu.id=Od.CustomerID
GROUP BY Od.CustomerID, Cu.FirstName
HAVING COUNT(Od.CustomerID) between 4 and  8 
ORDER BY [Customer Orders] DESC
1
scaisEdge 17 Авг 2019 в 19:17

Просто используйте HAVING предложение:

SELECT Cu.FirstName,COUNT(Od.CustomerID) as 'Customer Orders'
  FROM Customer as Cu
  INNER JOIN Orders as Od on Cu.id=Od.CustomerID
  GROUP BY Od.CustomerID, Cu.FirstName
 HAVING COUNT(Od.CustomerID) between 4 and 8
  ORDER BY [Customer Orders] DESC

Постскриптум Мы пока не знаем вашу СУБД. Для некоторых баз данных (таких как MySQL) SQL допускается использование псевдонимов в предложениях, таких как HAVING Customer_Orders between 4 and 8 для COUNT(Od.CustomerID) as Customer_Orders

3
Barbaros Özhan 17 Авг 2019 в 19:41