2012-01-10 206 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