2012-01-10 2 views
2

Приветствие всем. У меня есть база данных экспресс-SQL 2008, позволяет имя является tbl_Merchant, подобно тому, как следующее:SQL Top 10 Sales Every Month

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 месяцев, но я не думаю, что это хороший способ.

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

спасибо.

+0

Какой SQL (MySQL, Oracle, PostgreSQL, SQLServer и т. Д.) Вы используете? –

+0

@MarkBannister: 'TOP 10' указывает SQL Server или Sybase (оба' T-SQL') –

+0

Я использую MS SQL. – DragonZelda

ответ

3

Действительно для 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 
+0

См. Исправленный ответ –

+0

это неправильное: SUM (Sales) Sales. Прочтите вопрос. Продажи уже являются суммой для каждого торговца/месяца. – giammin

+0

@giammin вы читали до конца? –

-2
select top 10 Merchant, sum(Sales) from tbl_Merchant group by Merchant order by sum(Sales) desc 

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

+0

hmm ... почему -1 для этого ответа? –

+0

Не отвечаю на вопрос –

-1

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

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 продаж каждого месяца будет отображаться в разных столбцах по месяцам.

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

2

Try:

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

@LukasEder: Спасибо за исправление. –

+0

Этот ответ правильный, и проще понять! – DragonZelda

-1

Подробности в месяц для топ 10 в месяц может быть получена при помощи следующего запроса слишком

выберите коммерсанта , SUM (продажи) Всего_сезоны, месяц как Monthofyear
от tbl_Merchant
группа по месяцам, продавец, продажи
по месяцам, sales desc

+0

Причина для нисходящего потока? –

+0

Извините, это только списки из 10 лучших. Это не я хочу. – DragonZelda