冒险作品2012' SalesOrder'询问

时间:2015-02-19 18:21:04

标签: sql-server

我已经完成了从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

2 个答案:

答案 0 :(得分:0)

首先,我建议使用计算来返回每个订单的第一个月,这样您就可以获得DATEDATETIME数据类型进行查询,而不是使用单独的列来查看月份和年份。

根据需要,您需要显示每个月的前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