2016-09-14 1 views
1

Я хочу найти наиболее частый продукт, каждый из которых был продан вместе с продуктом с наибольшим доходом. Я написал несколько примеров, чтобы быть более ясными.Выбирайте наиболее часто используемые значения вместе с суммой

DECLARE @Products TABLE(ID INT, ProductName NVARCHAR(50), Price DECIMAL) 
DECLARE @Employees TABLE(ID INT, EmployeeName NVARCHAR(50)) 
DECLARE @Sales TABLE(ID INT, EmployeeID INT, ProductID INT, Quantity INT) 

INSERT INTO @Products VALUES 
(1, N'Product1', 300), 
(2, N'Product2', 500), 
(3, N'Product3', 700), 
(4, N'Product4', 800) 

INSERT INTO @Employees VALUES 
(1, N'Employee1'), 
(2, N'Employee2'), 
(3, N'Employee3') 

INSERT INTO @Sales VALUES 
(1,1,2,3), 
(2,1,3,4), 
(3,1,2,5), 
(4,2,2,7), 
(5,2,4,3), 
(6,3,2,3), 
(7,3,2,9), 
(8,3,4,8) 

соединяемых таблиц выглядит любит это:

enter image description here

Я написал некоторые выбрать

SELECT 
    e.EmployeeName 
    ,p.ProductName 
    ,SUM(s.Quantity) AS Quantity  
    ,p.ProductName 
    ,SUM(s.Quantity * p.Price) AS Price 
FROM @Products p 
    INNER JOIN @Sales s ON s.ProductID = p.ID 
    INNER JOIN @Employees e ON s.EmployeeID = e.ID 
GROUP BY e.EmployeeName, p.ProductName 
ORDER BY SUM(s.Quantity) DESC, SUM(s.Quantity * p.Price) 

, который возвращает этот результат, который не является правильным. Обратите внимание, что цена не заказывается. enter image description here

Я хочу написать в этом формате, выбрать ProductName и сумму количества, ProductName и сумму цены для каждого Employe отдельно.

Ожидаемый результат должен быть

EmployeeName  ProductName Quantity ProductName  Price 
------------  ----------- -------- -----------  ------ 
Employee3   Product2  12   Product4   6400 
Employee1   Product2  8   Product2   4000  
Employee3   Product4  8   Product2   6000 
Employee2   Product2  7   Product2   3500 
Employee1   Product3  4   Product3   2800 
Employee2   Product4  3   Product4   2400 
+0

Я считаю, что количество и цена упорядочен в соответствии с вашими выберите заявление. Первый заказ по Кол-во убывания, затем закажите по цене по возрастанию. – NickyvV

+0

Пожалуйста, сообщите также о ожидаемом выходе – Susang

+0

@NickyvV да, но цена не заказывается по возрастанию в любом случае – www1986

ответ

0

Ваш запрос начало. Затем вы можете использовать оконные функции и условное агрегацию:

SELECT EmployeeName, 
     MAX(CASE WHEN seqnum_q = 1 THEN ProductName END) as productname_q, 
     MAX(CASE WHEN seqnum_q = 1 THEN Quantity END) as quantity_q, 
     MAX(CASE WHEN seqnum_pq = 1 THEN ProductName END) as productname_pq, 
     MAX(CASE WHEN seqnum_pq = 1 THEN Quantity END) as quantity_pq 
FROM (SELECT e.EmployeeName, p.ProductName, 
      SUM(s.Quantity) AS Quantity, SUM(s.Quantity * p.Price) AS Price, 
      ROW_NUMBER() OVER (PARTITION BY e.EmployeeName 
           ORDER BY SUM(s.Quantity) DESC 
           ) as seqnum_q, 
      ROW_NUMBER() OVER (PARTITION BY e.EmployeeName 
           ORDER BY SUM(s.Quantity * p.Price) DESC 
           ) as seqnum_pq 
     FROM @Products p INNER JOIN 
      @Sales s 
      ON s.ProductID = p.ID INNER JOIN 
      @Employees e 
      ON s.EmployeeID = e.ID 
     GROUP BY e.EmployeeName, p.ProductName 
    ) ep 
GROUP BY EmployeeName; 
+0

Этот запрос возвращает только 3 строки – www1986

+0

@ www1986. , , Я вижу, вы отредактировали вопрос, чтобы предоставить образец вывода. Это возвращает одну строку для каждого сотрудника, что кажется больше в духе исходного вопроса. –

0

Изменение вашего заказа To:

ORDER BY SUM(s.Quantity) DESC, SUM(s.Quantity * p.Price) Desc 
+0

еще одна проблема – www1986

0

попробовать это:

SELECT 
    e.EmployeeName 
    ,p.ProductName 
    ,SUM(s.Quantity) AS Quantity  
    ,p.ProductName 
    ,SUM(s.Quantity * p.Price) AS Price 
FROM @Sales s 
    INNER JOIN @Products p ON s.ProductID = p.ID 
    INNER JOIN @Employees e ON s.EmployeeID = e.ID 

GROUP BY e.EmployeeName, p.ProductName 
ORDER BY e.EmployeeName, SUM(s.Quantity) DESC, SUM(s.Quantity * p.Price),p.ProductName 
+0

Исправьте ошибку, изменив предложение FROM так, чтобы оно было исполнено – Susang

+0

@suraz извините, по ошибке я тестировал несколько сценариев и забыл о товарах после продажи s –