代码之家  ›  专栏  ›  技术社区  ›  ShreddedSaber

SQL Server-窗口函数

  •  -2
  • ShreddedSaber  · 技术社区  · 7 年前

    所以,我需要一些家庭作业方面的帮助。

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

    • 销售经理现在希望您创建一个报告,根据其产品的总销售额和总销售数量(每个)对其产品进行排名 将是它自己的列)。创建返回的存储过程
      以下列,但也添加了两个新的秩列。

    • 上个月的订单。不应该有跳过的数字。

    • 为按订单日期描述排序的每一行生成唯一id

    1 回复  |  直到 4 年前
        1
  •  1
  •   Maurício Pontalti Neri    7 年前

    试试看

    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