SQL топ 10 продаж каждый месяц - PullRequest
2 голосов
/ 10 января 2012

Приветствую всех. У меня есть база данных SQL 2008 Express, пусть имя будет tbl_Merchant, как показано ниже:

Merchant | Sales | Month
Comp.1      100     1
Comp.2      230     1
Comp.3      120     1
Comp.1      200     2
Comp.2      130     2
Comp.3      240     2
Comp.1      250     3
  .          .      .
  .          .      .
  .          .      .

Мне нужно найти топ-10 торговцев с продажами каждый месяц в течение 12 месяцев.

Это очень легко, если это всего лишь один месяц.

SELECT TOP 10 
       Merchant, 
       Sales, 
       Month
FROM   tbl_Merchant
WHERE  Month = 1
ORDER BY Sales DESC

Но я застрял, если хочу найти их через 12 месяцев. Мне нужно отобразить 120 продавцов, которые входят в топ-10 продавцов каждого месяца. В настоящее время мое решение состоит в том, чтобы объединить 12 таблиц с 1 по 12 месяц, но я не думаю, что это хороший способ.

Может ли кто-нибудь любезно дать мне какое-нибудь предложение?

Большое спасибо.

Ответы [ 6 ]

4 голосов
/ 10 января 2012

Действительно для Sql Server 2005 +

Попробуйте в целом:

SELECT TOP 10 
       Merchant, 
       SUM(Sales) Sales
FROM   tbl_Merchant
WHERE  Month BETWEEN 1 and 12
GROUP BY Merchant
ORDER BY 2 DESC

ИЛИ

, если вам нужны подробности за месяц для топ10 В МЕСЯЦ

;WITH MonthsCTE(m) as
(
    SELECT 1 m
    UNION ALL 
    SELECT m+1
    FROM MonthsCTE
    WHERE m < 12
)
SELECT m [Month], t.*
FROM MonthsCTE
CROSS APPLY 
(
    SELECT TOP 10
       Merchant, 
       SUM(Sales) Sales
    FROM   tbl_Merchant
    WHERE  Month = MonthsCTE.m
    GROUP BY Merchant
    ORDER BY 2 DESC
) t
2 голосов
/ 10 января 2012

Попробуйте:

select * from
(SELECT Merchant, 
        Sales, 
        Month,
        row_number () over (partition by Month order by Sales desc) rn
 FROM   tbl_Merchant
 WHERE  Month between 1 and 12) v
where rn <= 10
order by Month, Sales desc

(Должно работать в SQLServer; не уверен насчет Sybase.)

0 голосов
/ 10 июля 2019
select Top 10 
         SaleID, 
         sum(Salelines) As LINESUM
Into #TOP10sales
from salestable
group by SaleID
order by sum(Salelines) asc;

Then confirm the sales are top 10

select * 
from #TOP10sales;

Then.

Select field..
       field..
       field..
from #TOP10sales 
Inner Join salestable on #TOP10sales.ID = salestable.ID;
0 голосов
/ 10 января 2012

Подробности в месяц для топ-10 в МЕСЯЦ можно также получить с помощью этого запроса

выбор продавца, SUM (продажи) Total_sales, month как Monthyyear
от tbl_Merchant
группа по месяцам, продавец, продажи
заказ по месяцам, продажа desc

0 голосов
/ 10 января 2012

Можно попробовать следующее:

SELECT top 10 Merchant,
isnull(SUM(CASE WHEN Month(ta.dt) = '01' THEN Sales END),0) AS "Jan Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '02' THEN Sales END),0) AS "Feb Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '03' THEN Sales END),0) AS "Mar Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '04' THEN Sales END),0) AS "Apr Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '05' THEN Sales END),0) AS "May Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '06' THEN Sales END),0) AS "Jun Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '07' THEN Sales END),0) AS "Jul Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '08' THEN Sales END),0) AS "Aug Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '09' THEN Sales END),0) AS "Sep Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '10' THEN Sales END),0) AS "Oct Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '11' THEN Sales END),0) AS "Nov Sales",
isnull(SUM(CASE WHEN Month(ta.dt) = '12' THEN Sales END),0) AS "Dec Sales"

FROM tbl_Merchant ORDER BY Sales DESC

Топ-10 продаж каждого месяца будут отображаться в виде различных столбцов по месяцам.

Надеюсь, это поможет вам.

0 голосов
/ 10 января 2012
select top 10 Merchant, sum(Sales) from tbl_Merchant group by Merchant order by sum(Sales) desc

Я более postgresql парень, но я думаю, что он может работать без (или с небольшим) изменения в mssql

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