Как отобразить следующие данные в запросе? - PullRequest
0 голосов
/ 20 мая 2018

Я пытался выполнить следующее упражнение, которое заключается в создании запроса с использованием SQL: «Найти количество продавцов, у которых более 3 клиентов в неделю. Показать идентификатор персонала, имя сотрудника, идентификатор клиента, имя клиентаи количество клиентов, с которыми продавец встречался. "

Объекты и соответствующие поля:

Staff:   [Staff_ID (PK), Staff_Name, ...]
Clients: [Client_ID (PK), Client_Name, Staff_ID (FK), ...]
Sales:   [Sale_ID (PK), Client_ID (FK), Staff_ID (FK), Date_of_Sale, ...]
(All data are strings except Date_of_Sale, which is in DATE format)

Я пытался выполнить это, используя следующее:

SELECT t.Staff_ID, t.Staff_Name, COUNT(s.Client_ID), 
COUNT(c.Client_Name), DATEPART(wk, s.Date_of_Sale) as Week
FROM Clients c, Staff t, Sales s
GROUP BY DATEPART(wk, s.Date_of_Sale), t.Staff_ID, t.Staff_Name
HAVING COUNT(DATEPART(wk, s.Date_of_Sale)) > 3

Я знаю, что это неправильно, но я не знаю, как это исправить, так как я очень неквалифицирован в sql.Я хочу понять, как это сделать, и я мог (в ограниченной степени), перепроектировав это.Еще лучше, если бы кто-то объяснил мне это, я был бы очень признателен, заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Существует большая разница между количеством клиентов, с которыми продавец встречался и количеством продаж, совершенных продавцом .Главным образом, следует ли считать повторные посещения одного и того же клиента.Первый говорит «нет», второй - «да», потому что количество клиентов не изменилось, а количество продаж изменилось.

-- Get list of clients with sales greater than 3 in a week
WITH SalesCount AS (
    SELECT Client_ID AS 'Client', DATEPART(wk, Date_of_Sale) AS 'week', 
        COUNT(Staff_ID) AS 'Sales_Count'
    FROM Sales
    GROUP BY DATEPART(wk, Date_of_Sale), Client_ID
    HAVING COUNT(Staff_ID) > 3  ),
-- Shorten the list to unique entries and add the StaffID
ClientList AS (
    SELECT DISTINCT sc.Client, c.Staff_ID
    FROM SalesCount AS sc
    INNER JOIN Clients AS c ON sc.Client = c.Client_ID) ,
-- Create a count of clients visited
ClientCount AS (
    SELECT COUNT(l.Client) AS visitors, l.Staff_ID
    FROM ClientList AS l
    GROUP BY l.Staff_ID)

SELECT cc.visitors, cc.Staff_ID, l.Client, t.Staff_Name
FROM ClientCount AS cc
INNER JOIN ClientList AS l ON cc.Staff_ID = l.Staff_ID
INNER JOIN Staff AS t ON t.Staff_ID = l.Staff_ID 
INNER JOIN Clients AS c ON l.Client = c.Client_ID
0 голосов
/ 20 мая 2018

Здесь мы идем

WITH CTE AS (
    SELECT *, DATEPART(wk, s.Date_of_Sale) as SALES_WEEK
    FROM Clients c
    INNER JOIN Sales s ON c.Client_ID = s.CLIENT_ID
    INNER JOIN Staff t ON t.STAFF_ID = s.STAFF_ID
)

SELECT SALES_WEEK, Staff_ID, Staff_Name, COUNT(1) AS NO_OF_SALES
FROM CTE
GROUP BY SALES_WEEK, Staff_ID, Staff_Name
HAVING COUNT(1) > 3

Надеюсь, что это работает, как ожидалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...