2016-06-30 4 views
0

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

----------------------------------------- 
|OrderAccount| Item  | OrderDate | 
|ABC   | Shoes #1 | 10.01.2016 | 
|ABC   | Shoes #2 | 10.01.2016 | 
|ABC   | Shoes #2 | 13.02.2016 | 
|ABC   | Shoes #1 | 12.12.2016 | 
|ABC   | Shoes #4 | 09.01.2016 | 
|RDD   | Shoes #1 | 01.21.2016 | 
|RDD   | Shoes #2 | 01.22.2016 | 
|RDD   | Shoes #1 | 03.01.2016 | 
|RDD   | Shoes #6 | 03.11.2016 | 
|RDD   | Shoes #1 | 03.21.2016 | 
----------------------------------------- 

Я использую следующий запрос упомянутого in earlier post.

SELECT b.OrderAccount, b.Item 
FROM(
    SELECT *, RANK() OVER(PARTITION BY a.OrderAccount ORDER BY a.count_item DESC) AS RowRank 
    FROM(
     SELECT so.OrderAccount, so.Item, count(item) count_item 
     FROM SalesOrders so 
     GROUP BY so.OrderAccount, so.Item 
    ) a 
) b 
WHERE b.RowRank <= 2 

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

ответ

0

Это, как я это сделал:

SELECT a.OrderAccount, a.Item, a.Occurrence, b.SalesOrdersPerAccount, 
     CAST(CAST(a.Occurrence AS decimal)/CAST(b.SalesOrdersPerAccount AS decimal)*100 AS decimal(16,2)) AS Percentage 
FROM 
(
    SELECT so.OrderAccount, so.Item, COUNT(*) AS Occurrence FROM SalesOrders so 
    WHERE so.Item IS NOT NULL 
    GROUP BY so.OrderAccount, so.Item 
) a 

LEFT OUTER JOIN 
(
    SELECT so.OrderAccount, COUNT(*) AS SalesOrdersPerAccount FROM SalesOrders so 
    WHERE so.Item IS NOT NULL 
    GROUP so.OrderAccount 
) b ON a.OrderAccount = b.OrderAccount 

WHERE b.SalesOrdersPerAccount IS NOT NULL 
ORDER BY a.OrderAccount, Percentage DESC 
0

Каждая строка представляется отдельным заказом в соответствии с данными вашего вопроса. Так что, я думаю, что вы можете сделать:

SELECT so.OrderAccount, so.Item, 
     (count_item * 1.0/num_orders) as proportion_of_orders 
FROM (SELECT so.OrderAccount, so.Item, count(item) as count_item, 
      SUM(COUNT(*)) OVER (PARTITION BY so.OrderAccount) as num_orders, 
      RANK() OVER (PARTITION BY so.OrderAccount ORDER BY COUNT(*) DESC) as rnk 
     FROM SalesOrders so 
     GROUP BY so.OrderAccount, so.Item 
    ) so 
WHERE rnk <= 2; 
+0

но также возможно для того, чтобы иметь продажу более чем на 1 линию. что нам тогда делать? – Afflatus

+0

@Afflatus. , , Вы должны задать другой вопрос с соответствующими данными и желаемыми результатами. –

Смежные вопросы