2017-07-27 64 views
-2

所以,我需要一些帮助做些功课。SQL Server - 窗口函数

下面是我需要使用的数据库部分的模式。 Table Scema

我敢肯定,它有一些冗余(我希望任何与安装有关的帮助)。不管怎么说,这里是分配:

  • 销售经理现在想你创建一个由他们的总销售额和总销售数量都位居她的产品的报告(每个 将自己列)。创建一个存储过程,返回
    以下列,但也添加了两个新的等级列。

    产品名称|订单计数|总销售价值|总销售数量

  • CEO希望根据上个月的销售情况了解销售情况。请向她提供一个查询,以便在上个月根据订单数量 对产品进行排名。应该没有跳过的数字。

  • 创建生成客户编号,订单日期,等***订单列表的SELECT语句中使用的行数函数 产生由订单日期排序倒序每行一个唯一的ID

+0

我会说车包含一个订单。一个订单包含OrderItems。一个OrderItem有一个ProductId。所以一个购物车要很多订单。一个订单到许多订单项。一个订单项到一个产品。我没有看到将购物车链接到订购产品或产品的任何价值。 –

+2

这是你的家庭作业,你希望其他人为你做?到目前为止你做了什么? – Eric

+1

你是否提供这个数据库教授或者你创建了它?我问,因为该数据库有很多问题。我创造了肖恩, –

回答

1

试试吧

CREATE PROCEDURE report_salesmanager 
AS 
    WITH cte_main AS 
    ( 
      SELECT  p.NAME, 
         Isnull(Count(DISTINCT o.orderid), 0) corderid, 
         Sum(Isnull(o.ordertotal, 0))   sordertotal, 
         Sum (Isnull(oi.orderitemquantity, 0)) sorderitemquantity 
      FROM  product p 
      LEFT JOIN orderitem oi 
      INNER JOIN orders o 
      ON   o.orderid - oi.orderid 
      ON   p.productid = oi.productid 
      GROUP BY p.NAME), cte_rank_value AS 
    ( 
      SELECT NAME, 
        Rank() OVER(ORDER BY sordertotal DESC) rk 
      FROM  cte_main), cte_rank_qtd AS 
    ( 
      SELECT NAME, 
        Rank() OVER(ORDER BY sorderitemquantity DESC) rk 
      FROM  cte_main) 
    SELECT  a.NAME [Product Name], 
      a.corderid, 
      [Orders Count] a.sordertotal [Total Sales Value], 
      b.rk [Rank Total Sales Value], 
      a.sorderitemquantity [Total Sales Quantity], 
      c.rk [Rank Total Sales Quantity] 
    FROM  cte_main a 
    INNER JOIN cte_rank_value b 
    ON   a.NAME = b.NAME 
    INNER JOIN cte_rank_qtd c 
    ON   a.NAME = c.NAME 

GO 

CREATE PROCEDURE report_ceo 
AS 
    DECLARE @somedateLastMonth DATE = Dateadd(-1,m,Getdate()) WITH cte_main AS 
    ( 
      SELECT  p.NAME, 
         Isnull(Count(DISTINCT o.orderid), 0) corderid, 
         Sum(Isnull(o.ordertotal, 0))   sordertotal, 
         Sum (Isnull(oi.orderitemquantity, 0)) sorderitemquantity 
      FROM  product p 
      INNER JOIN orderitem oi 
      INNER JOIN orders o 
      ON   o.orderid - oi.orderid 
      ON   p.productid = oi.productid 
      WHERE  Year(o.orderdate) * 100 + Month(o.orderdate) = Year(@somedateLastMonth) * 100 + Month(@somedateLastMonth) 
      GROUP BY p.NAME), 
    cte_rank_value AS 
    ( 
      SELECT NAME, 
        Rank() OVER(ORDER BY sordertotal DESC) rk 
      FROM  cte_main), 
    cte_rank_qtd AS 
    ( 
      SELECT NAME, 
        Rank() OVER(ORDER BY sorderitemquantity DESC) rk 
      FROM  cte_main) 
    SELECT  a.NAME [Product Name], 
      a.corderid, 
      [Orders Count] a.sordertotal [Total Sales Value], 
      b.rk [Rank Total Sales Value], 
      a.sorderitemquantity [Total Sales Quantity], 
      c.rk [Rank Total Sales Quantity] 
    FROM  cte_main a 
    INNER JOIN cte_rank_value b 
    ON   a.NAME = b.NAME 
    INNER JOIN cte_rank_qtd c 
    ON   a.NAME = c.NAME 
go 


SELECT  Row_number() OVER (ORDER BY o.orderdate DESC, o.ordertime DESC) rowNumber , 
      * 
FROM  product p 
INNER JOIN orderitem oi 
INNER JOIN orders o 
ON   o.orderid - oi.orderid 
ON   p.productid = oi.productid 
INNER JOIN cart c 
ON   c.orderid = o.orderid