Выберите данные с объединением из 3 таблиц - PullRequest
1 голос
/ 05 марта 2019

Я только начал изучать SQL сейчас и пытаюсь понять этот сценарий:

У нас есть 3 таблицы:

Clients (ClientID, Name, Surname, Age)
Products (ProductID, Name,    Price)
Purchases (PurchaseID, Date, ClientID, ProductID)

Какой запрос SQL лучше всего покажет количество покупок (общая сумма на одного клиента), совершенных клиентами?

Показывать должны только клиенты, совершившие более 1 покупки.

Результат должен содержать следующие поля: ФИО, Количество покупок, Общая сумма.

У меня есть этот запрос, но он объединяет только две таблицы. Как мне присоединиться к третьей таблице (Products.Price) и рассчитать общую сумму на одного клиента?

SELECT  CONCAT(IFNULL(Name,''),' ', IFNULL(Surname,'')) as FullName,
        COUNT(purchaseId) as "Quantity of purchases"
FROM Purchases as P
INNER JOIN Clients as C 
on P.ClientID = C.ClientID
GROUP BY C.ClientID,Name, Surname
HAVING COUNT(PurchaseId) > 1;

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Вы используете INNER JOIN снова как:

SELECT  CONCAT(IFNULL(Name,''),' ', IFNULL(Surname,'')) as FullName,
        COUNT(purchaseId) as "Quantity of purchases"
FROM Purchases as P
INNER JOIN Clients as C 
on P.ClientID = C.ClientID
INNER JOIN Products as PR 
on PR.ProductID = P.ProductID
GROUP BY C.ClientID,Name, Surname
HAVING COUNT(PurchaseId) > 1;
0 голосов
/ 05 марта 2019

Я бы порекомендовал использовать CONCAT_WS() для объединения имени.Это обрабатывает значения NULL более элегантно, чем ваше решение.

SELECT CONCAT_WS(c.Name, c.Surname) as FullName,
       COUNT(*) as num_purchases,
       SUM(pr.price) as total_price
FROM Clients c INNER JOIN
     Purchases p 
     ON P.ClientID = C.ClientID INNER JOIN
     Products pr
     ON pr.ProductID = p.ProductID
GROUP BY CONCAT_WS(c.Name, c.Surname)
HAVING COUNT(DISTINCT p.PurchaseId) > 1;

Обратите внимание на COUNT(DISTINCT) в предложении HAVING.Это гарантирует, что у клиентов есть по крайней мере две покупки .Если вы хотите, чтобы клиенты имели как минимум два продукта или покупки, вы можете использовать COUNT(*) - но ваш вопрос касается покупок.

0 голосов
/ 05 марта 2019

Вы можете попробовать ниже -

SELECT  CONCAT(IFNULL(Name,''),' ', IFNULL(Surname,'')) as FullName,
        COUNT(purchaseId) as "Quantity of purchases",sum(price) as totalamount
FROM Purchases as P
INNER JOIN Clients as C 
on P.ClientID = C.ClientID
inner join Products p1 on p.productid=p1.productid
GROUP BY C.ClientID,Name, Surname
HAVING COUNT(PurchaseId) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...