SQL Server - 我如何对上个月的产品进行排名?
Posted
技术标签:
【中文标题】SQL Server - 我如何对上个月的产品进行排名?【英文标题】:SQL Server - How would I rank products from the last month? 【发布时间】:2017-07-28 16:02:48 【问题描述】:我已经开始充实一些东西,但我无法添加某种窗口函数来获得预期的结果,即在我的代码中调用的数据、产品按销售额排名月。如果可以提供任何帮助,我将不胜感激!
这是被问到的:
CEO 想了解基于上个月销售额的销售额。 请向她提供查询以按数量对产品进行排名 上个月的订单。不应有跳过的数字。
这是我目前得到的:
SELECT
P.NAME AS 'Product Name',
Isnull(Count(DISTINCT O.OrderID), 0) AS 'Orders Count',
Sum(Isnull(o.ordertotal, 0)) AS 'Orders Total',
Sum (Isnull(oi.orderitemquantity, 0)) AS 'Item Total'
FROM
Product P
INNER JOIN
OrderItem OI ON OI.ProductID = P.ProductID
INNER JOIN
Orders O ON O.OrderID = OI.OrderID
GROUP BY
P.Name
这也需要在存储过程中,所以任何帮助都会很棒。
【问题讨论】:
SQL Server 有一个功能:docs.microsoft.com/en-us/sql/t-sql/functions/… 好吧,朋友 - 正如@Caramiriel 所说,根据您提供的标准,您可以使用一些功能对数据进行排名。在将其创建为存储过程时,您有什么问题或疑问? 请提供示例数据以及您已经尝试过的内容。 【参考方案1】:您可以使用 CTE
和 RANK()
函数来完成此操作
create procedure yourProcedure (@TheDate datetime = null)
as
if @TheDate is null
begin
set @TheDate = getdate()
end
;with cte as(
SELECT
P.NAME AS 'Product Name',
Isnull(Count(DISTINCT O.OrderID), 0) AS 'Orders Count',
Sum(Isnull(o.ordertotal, 0)) AS 'Orders Total',
Sum (Isnull(oi.orderitemquantity, 0)) AS 'Item Total'
FROM
Product P
INNER JOIN
OrderItem OI ON OI.ProductID = P.ProductID
INNER JOIN
Orders O ON O.OrderID = OI.OrderID
WHERE
--here is the limiting to the previous month based off the month passed in
SomeDateField >= DATEADD(MONTH, DATEDIFF(MONTH, 0, @TheDate)-1, 0)
and
SomeDateField < DATEADD(month, DATEDIFF(month, 0, @TheDate), 0)
GROUP BY
P.Name)
select
*
,DENSE_RANK() over (order by [Orders Count]) as RK
from cte
DENSE_RANK()
不会跳过数字,而 RANK()
可能取决于您的数据集。
示例
declare @table table (ID int identity (1,1), item int)
insert into @table
values
(1),
(2),
(3),
(3),
(3),
(3),
(4),
(5),
(6)
select
*
,rank() over (order by item) TheRank
,dense_rank() over (order by item) TheDenseRank
from @table
+----+------+---------+--------------+
| ID | item | TheRank | TheDenseRank |
+----+------+---------+--------------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | 3 | 3 | 3 |
| 4 | 3 | 3 | 3 |
| 5 | 3 | 3 | 3 |
| 6 | 3 | 3 | 3 |
| 7 | 4 | 7 | 4 | --notice difference starting here
| 8 | 5 | 8 | 5 |
| 9 | 6 | 9 | 6 |
+----+------+---------+--------------+
另外,这听起来像是家庭作业——如果是,我建议将其放在问题中以防止假设。
【讨论】:
以上是关于SQL Server - 我如何对上个月的产品进行排名?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?