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】:

您可以使用 CTERANK() 函数来完成此操作

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 中获取一个季度的上个月数据?

如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?

为产品生命周期创建 SQL Server 视图

最新排行!Oracle 连登榜首,SQL Server 已持续下滑 9 个月。。

SQL SERVER事物日志增长过快

如何在 sql server 中获取最近 3 个月的名称