2017-11-14 23 views
1

Ich habe drei Tabellen und ich muss den Umsatz für John Smith im Jahr 2015 geteilt durch Monate berechnen.SQL um Umsatz und Gruppe nach Monat zu zählen (bitte überprüfen)

    OrderItems 
        ------------  Orders 
Products   OrderItem_ID  ------ 
----------   Order_ID <---> Order_ID 
Product_ID <---> Product_ID   Type 
Name    Quantity   Date 
Category   UnitPrice   Customer 

Die Tabellen sind durch Order_ID & Order_ID (Tabs Orderitem und Bestellungen) und dann durch Product_IDs (Tabs Produkte und Orderitem). Ich schätze, ich brauche Tab Produkte sowieso nicht.

Orders (Order_ID INT, Type INT, Date DATETIME, Customer VARCHAR) 
OrderItems (OrderItem_ID INT, Order_ID INT, Product_ID INT, Quantity INT, UnitPrice MONEY) 
Products (Product_ID INT, Name VARCHAR, Category VARCHAR) 

Ich habe Dutzende Minuten gewesen googeln und Wissen erfrischend, weil es eine lange Weile her, seit ich habe SQL zum letzten Mal verwendet wird.

Ich schrieb diese Abfrage, aber ich bin mir absolut nicht sicher. Kannst du es bitte überprüfen?

SELECT 
    SUM(a.quantity * a.price) AS 'turnover', 
    DATEPART(month, a.date) AS 'month' 
FROM 
(
    SELECT 
     Quantity.OrderItems AS 'quantity', 
     UnitPrice.OrderItems AS 'price', 
     Date.Orders AS 'date', 
     Customer.Orders AS 'customer' 
    FROM Orders 
    JOIN Orders 
     ON OrderItems.Order_ID = Orders.Order_ID 
    WHERE 
     date BETWEEN 2015-01-01 and 2015-12-31 
     AND customer = 'John Smith' 
) a 
GROUP BY month 
ORDER BY month 

Vielen Dank

//

+0

Welche [DBMS] (https verbinden://de.wikipedia.org/wiki/DBMS) Produkt verwenden Sie? "_SQL_" ist nur eine Abfragesprache, nicht der Name eines bestimmten Datenbankprodukts. –

+0

versuchen Sie, Ihre innere Abfrage auszuführen - sie sollte nicht kompiliert werden. Sie müssen sich 'Bestellungen' anschließen, um' Artikel', nicht 'Bestellungen', erneut zu bestellen. – Beth

+0

auch, Ihre 'Gruppe von' geht nicht zur Arbeit mit Bezug auf Ihren Alias' Monat'. Sie müssen nach Ihrer Funktion "datepart" gruppieren. Es ist vielleicht einfacher zu verstehen, wenn Sie in Ihrer inneren Abfrage den Monat "datepart" zurückgeben. – Beth

Antwort

0

Sie in Code eine kleinere Tippfehler korrigiert müssen Orders zu OrderItems

SELECT 
    SUM(a.quantity * a.price) AS 'turnover', 
    DATEPART(month, a.date) AS 'month' 
FROM 
(
    SELECT 
     OI.Quantity AS 'quantity', 
     OI.UnitPrice AS 'price', 
     O.Date AS 'date', 
     O.Customer AS 'customer' 
    FROM Orders O 
    INNER JOIN OrderItems OI 
     ON O.Order_ID = OI.Order_ID 
    WHERE 
     O.date BETWEEN 2015-01-01 and 2015-12-31 
     AND O.customer = 'John Smith' 
) a 
GROUP BY DATEPART(month, a.date) 
ORDER BY DATEPART(month, a.date)