SQL TOP 10 проданных товаров, сгруппированных по товарам, сгруппированных по покупателям - PullRequest
0 голосов
/ 28 мая 2018

У меня есть база данных, содержащая:

Customerno, No_, Количество

Я хотел бы вернуть ТОП 10 самых продаваемых продуктов на одного клиента за один раз ...

я могу получить ТОП 10, например:

SELECT TOP 10 [No_],sum([Quantity]) as antal 
FROM orderlines
WHERE [Gen_ Prod_ Posting Group] = 'HANDEL' 
AND [Customerno] = 10001
GROUP BY [No_] 
HAVING sum([Quantity]) >= 2
ORDER BY sum([Quantity]) DESC

, но мне нужен какой-то "foreach", потому что приведенный выше запрос ограничен клиентом: 10001

я бы хотел, чтобы он был зацикленforeach Different customerno, поэтому я получаю полный список

простой способ, который я знаю, - это сделать

SQL-запрос на PHP следующим образом:

while($row = myssql_fetch_array(mssql_query(SELECT DISTINCT Customerno FROM orderlines)))
{

$new_query = ("SELECT TOP 10 [No_],sum([Quantity]) as antal 
FROM orderlines
WHERE [Customerno] = $row['customerno']
GROUP BY [No_] 
HAVING sum([Quantity]) >= 2
ORDER BY sum([Quantity]) DESC");


}

но я чувствуюэто должно быть более эффективно делать прямо в SQL?

Ответы [ 2 ]

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

Канонический метод использует row_number():

SELECT cn.CustomerNo, cn.[No_], cn.antal
FROM (SELECT CustomerNo, [No_], SUM(Quantity) as antal,
             ROW_NUMBER() OVER (PARTITION BY CustomerNo ORDER BY SUM(Quantity) DESC) as seqnum
      FROM orderlines ol
      WHERE Gen_ Prod_ Posting Group = 'HANDEL' 
      GROUP BY CustomerNo, [No_] 
     ) cn
WHERE seqnum <= 10
ORDER BY CusterNo, antal DESC;

Я удалил условие HAVING, поскольку оно не является частью вашей постановки задачи.Очевидно, что вы можете отфильтровать это, основываясь на некотором минимуме antal.

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

Каноническим способом является использование ROW_NUMBER.Но вы можете использовать OUTER APPLY для имитации For-each:

SELECT DISTINCT Customerno, sub.*
FROM orderlines o
OUTER APPLY (SELECT TOP 10 [No_],sum([Quantity]) as antal 
             FROM orderlines o2
             WHERE [Gen_ Prod_ Posting Group] = 'HANDEL' 
                AND o.Customerno = o2.Customerno
             GROUP BY [No_] 
             HAVING sum([Quantity]) >= 2
             ORDER BY antal DESC
            ) AS sub
ORDER BY Customerno, sub.antal DESC
...