2017-07-27 3 views
-2

Donc, j'ai besoin d'aide pour faire mes devoirs.SQL Server - Fonctions fenêtrées

Voici le schéma des parties de la base de données que je dois utiliser. Je suis sûr qu'il y a quelques redondances dedans (j'apprécierais n'importe quelle aide avec l'installation aussi bien). Quoi qu'il en soit, voici la mission:

  • Le directeur des ventes serait maintenant comme vous de créer un rapport qui classe ses produits par les deux leurs ventes totales et la quantité totale des ventes (chaque sera sa propre colonne). Créez une procédure stockée qui renvoie
    les colonnes suivantes, mais également avec les deux nouvelles colonnes de rang ajouté.

    Nom du produit | Commandes Count | Valeur totale des ventes | Total des ventes Quantité

  • Le PDG aimerait connaître les ventes basées sur les ventes du mois dernier. S'il vous plaît lui fournir une requête pour classer les produits par le nombre de commandes au cours du dernier mois. Il devrait y avoir aucun numéro de SKIPPED.

  • Créer une instruction SELECT qui génère une liste de commandes avec identifiant client, date de commande, etc. *** Utilisez la fonction de numéro de ligne à générer un identifiant unique pour chaque ligne qui est triée par date de commande DESC

+0

Je dirais un panier contient des commandes. Une commande contient des OrderItems. Un OrderItem a un ProductId. Donc un panier à plusieurs commandes. Une commande à plusieurs orderitems. Un orderitem à un produit. Je ne vois aucune valeur reliant le chariot aux ordres de commande ou aux produits. –

+2

Ceci est votre devoir, et vous voulez que d'autres personnes le fassent pour vous? Qu'avez-vous fait jusqu'à présent? – Eric

+1

Avez-vous enseigné cette base de données ou l'avez-vous créée? Je demande parce qu'il y a beaucoup de problèmes avec cette base de données. –

Répondre

1

Essayez-le

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