2012-01-10 208 views
2

問候所有。我有一個SQL 2008 Express數據庫,讓名字是tbl_Merchant,類似如下:SQL每月銷售前10名

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月份的12個表格合併在一起,但我認爲這不是一個好方法。

任何人都可以給我任何建議嗎?

非常感謝。

+0

您正在使用哪種SQL(MySQL,Oracle,PostgreSQL,SQLServer等)? – 2012-01-10 09:44:01

+0

@MarkBannister:'TOP 10'表示SQL Server或Sybase(都是'T-SQL') – 2012-01-10 10:02:12

+0

我正在使用MS SQL。 – DragonZelda 2012-01-11 02:49:42

回答

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 

OR

,如果你需要每月細節十大每月

;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

查看更正的答案 – 2012-01-10 09:52:28

+0

這是不正確的:SUM(Sales)Sales。閱讀問題。銷售額已經是每個商家/月份的總和。 – giammin 2012-01-10 10:06:19

+0

@giammin你讀到最後? – 2012-01-10 10:21:29

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

我更PostgreSQL的傢伙,但我認爲它可能沒有(或很少)的改裝工作在MSSQL

+0

嗯...爲什麼-1這個答案? – 2012-01-10 09:54:17

+0

不回答問題 – 2012-01-10 10:57:28

-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 

十大銷量每月將顯示爲每月不同的列。

希望它可以幫助你。

2

嘗試:

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:謝謝你的糾正。 – 2012-01-10 10:19:56

+0

這個答案也正確,並且更易於理解! – DragonZelda 2012-01-11 03:15:39

-1

細則十大每月可使用此查詢過

選擇369導出,SUM(銷售)Total_sales,月份爲Monthofyear
from tbl_Merchant
按月組,商家,銷售
按月銷售,銷售描述

+0

Downvote的原因? – 2012-01-10 15:49:23

+0

對不起,它只列出了前10名。這不是我想要的。 – DragonZelda 2012-01-11 03:17:11