问候大家。我有一个 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
. . .
. . .
. . .
Run Code Online (Sandbox Code Playgroud)
我需要找到 12 个月内每个月销售额排名前 10 的商家。
如果只有1个月,这很容易。
SELECT TOP 10
Merchant,
Sales,
Month
FROM tbl_Merchant
WHERE Month = 1
ORDER BY Sales DESC
Run Code Online (Sandbox Code Playgroud)
但是如果我想在 12 个月内找到它们,我就会陷入困境。我需要显示 120 个商家,它们是每个月的前 10 个销售商家。目前我的解决方案是将第 1 个月到第 12 个月的 12 个表合并在一起,但我认为这不是一个好方法。
任何人都可以给我任何建议吗?
非常感谢。
适用于 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
Run Code Online (Sandbox Code Playgroud)
或者
如果你需要每月细节前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
Run Code Online (Sandbox Code Playgroud)
小智 5
尝试:
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
Run Code Online (Sandbox Code Playgroud)
(应该在 SQLServer 中工作;不确定 Sybase。)