我已经完成了从Adventure works 2012数据库分析'SalesOrderHeader'表的任务。到目前为止,我的代码设法显示过去12个月,销售月份和年份,订单号,净值和销售人员每个月的订单,但是,我发现很难工作如何只显示每个月的5个最大订单。我还需要添加一个指标来显示每个订单值的位置(1-5)。我一直在努力解决这个问题,我想知道是否有人可以提供帮助?以下是我到目前为止的代码:
select Ordermonth, OrderYear, SOH.SalesOrderNumber, SOH.SubTotal, SOH.TotalDue, P.FirstName, P.LastName
from ( select top (5)MONTH(OrderDate)as OrderMonth, YEAR(OrderDate)as OrderYear, SalesOrderNumber, SubTotal, TotalDue
from Sales.SalesOrderHeader
where MONTH(OrderDate) = 1 and DATEDIFF(month, OrderDate, GETDATE()) <=12
order by TotalDue desc) as A, Sales.SalesOrderHeader SOH Join Sales.SalesPerson SP on
SOH.SalesPersonID = SP.BusinessEntityID Join Person.Person P On
SP.BusinessEntityID = P.BusinessEntityID
答案 0 :(得分:0)
首先,我建议使用计算来返回每个订单的第一个月,这样您就可以获得DATE
或DATETIME
数据类型进行查询,而不是使用单独的列来查看月份和年份。
根据需要,您需要显示每个月的前5个订单并按顺序排列,然后解决方案是使用ROW_NUMBER
窗口函数以及合适的PARTITION
和{{1 }}
如下所示的查询是朝着正确方向迈出的一步。在下面的查询中,ORDER BY
窗口函数正在为ROW_NUMBER
排序的每个OrderMonth
组创建行号。然后在外部查询中使用CTE将结果限制为每月5个,并且还应用您的日期期限标准。
但是,如果要求也显示没有订单的月份,则需要更多工作。
SubTotal
答案 1 :(得分:0)
使用窗口函数按月对行进行排名,然后按该等级进行筛选:
;
WITH cte
AS ( SELECT MONTH(OrderDate) mnt ,
SubTotal ,
TotalDue ,
ROW_NUMBER() OVER ( PARTITION BY MONTH(OrderDate) ORDER BY SubTotal DESC, TotalDue DESC ) AS rn
FROM Sales.SalesOrderHeader
)
SELECT *
FROM cte
WHERE rn <= 5