2016-09-23 98 views
3

我有以下的數據庫架構(重圖像),Database Schema時間總結

而且我想編寫一個查詢該查詢返回的結果是這樣的...... (列標題) :PRODUCT_GROUP - PRODUCT_NAME - Week1 - Week2 - 譯員更加的 - Week4 - QTY_Order

Week1是當前的日期和前7天之間的特定產品的所有銷售。 Week2都是特定商品銷售從2個星期前的(這樣的currentdate -7days及的currentdate之間 - 14日)
譯員更加從3個星期前...等的特定產品的所有銷售;
QTY_Order是第一週,第二週,第三週的特定產品銷售的平均值&第4周。

以下SQL將生成:Product_Group - Product_Name - Week1 - QTY_Order(但quantity_order不正確)。

SELECT Product.ProductGroupId, Product.Name, SUM(SaleLine.Quantity) AS Week1, SUM(SaleLine.Quantity) AS OrderQty 
FROM Sale 
JOIN SaleLine ON Sale.ID = SaleLine.SaleId 
JOIN Product ON SaleLine.ProductId = Product.Id 
WHERE Sale.SaleDateTime > (CURDATE() - INTERVAL 7 DAY) 
GROUP BY Product.ProductGroupId, Product.Name; 

我也嘗試了以下SQL來獲得:PRODUCT_NAME - Week1 - Week2 - QTY_Order(再次,qty_order是不正確的),但week2返回所有空的。

SELECT Product.ProductGroupId, Product.Name, SUM(SaleLine.Quantity) AS Week1, (SELECT SUM(SaleLine.Quantity) 
    FROM SaleLine 
    JOIN Sale ON SaleLine.SaleID = Sale.ID 
    JOIN Product on SaleLine.ProductId = Product.Id 
    WHERE Sale.SaleDateTime BETWEEN (CURDATE() - INTERVAL 14 DAY) AND (CURDATE() - INTERVAL 7 DAY)) AS Week2, SUM(SaleLine.Quantity) AS QTY_TO_ORDER 
FROM Sale 
JOIN SaleLine ON Sale.ID = SaleLine.SaleId 
JOIN Product ON SaleLine.ProductId = Product.Id 
WHERE Sale.SaleDateTime > (CURDATE() - INTERVAL 7 DAY) 
GROUP BY Product.ProductGroupId, Product.Name; 

任何人都可以指出即將出現錯誤的第2周(即其返回空)。
任何人都可以想到任何更簡單/更清潔的方式來編碼?
任何人都可以提供一些指針來計算QTY_Order嗎?

預先感謝任何幫助的人能提供:-)

**編輯 - 通過請求添加(customer表中不包括):
的CREATE TABLE語句(也有作爲約束各種觸發不包括)

CREATE TABLE ProductGroup( Id int PRIMARY KEY AUTO_INCREMENT, Name varchar(50) NOT NULL );

CREATE TABLE Product( Id int PRIMARY KEY AUTO_INCREMENT, ProductGroupId int, Name varchar(100) NOT NULL, Price decimal(8,2), QuantityOnHand int NOT NULL, QuantitySold int NOT NULL, QuantityToOrder int NOT NULL, QuantityRequested int NOT NULL, CONSTRAINT FK_Product_ProductGroup FOREIGN KEY (ProductGroupId) REFERENCES ProductGroup(Id) );

CREATE TABLE Sale( Id int PRIMARY KEY AUTO_INCREMENT, CustomerId int, SaleDateTime datetime NOT NULL, CONSTRAINT Sale_Customer FOREIGN KEY (CustomerId) REFERENCES Customer(Id) );

CREATE TABLE SaleLine( Id int PRIMARY KEY AUTO_INCREMENT, ProductId int NOT NULL, SaleId int NOT NULL, Quantity int NOT NULL, CONSTRAINT FK_SaleLine_Product FOREIGN KEY (ProductId) REFERENCES Product(Id), CONSTRAINT FK_SaleLine_Sale FOREIGN KEY (SaleId) REFERENCES Sale(Id) );

+0

雖然你的圖表看起來很漂亮,但有幾個show創建table語句,並且幾行樣例數據會更有用 – e4c5

+0

這被稱爲數據透視表。看看[MySQL數據透視表](http://stackoverflow.com/questions/7674786/mysql-pivot-table)的例子。你將不得不用'sum'來代替'count'。對於您的訂單數量,您需要一個'max(SaleLine.Quantity)AS OrderQty',因爲您只需要一次。 – Solarflare

回答

1

你是想從你的五個信息摘要:Week1,Week2,譯員更加,Week4和QTY_Order。這使得一個複雜的GROUP BY查詢。

最好一步一步接近這類事情。您的前兩步應該是編寫單獨的查詢,以生成正確的Week1和QTY_Order查詢。這將幫助您正確地掌握業務邏輯。你想要統計訂單嗎?你想賣出總單位嗎?你想總結總收入嗎?

(我寧願不要嘗試爲你寫這樣的疑問,這是你的數據,而不是我的。)

一旦你有了那種事吧,你可以做這樣的事情的僞代碼,讓您每週摘要。

SELECT group, name, 
     SUM(CASE WHEN saledate < CURDATE() - INTERVAL 0 DAY 
        AND saledate >= CURDATE() - INTERVAL 7 DAY THEN Quantity 
        ELSE 0 END) Week1, 
     SUM(CASE WHEN saledate < CURDATE() - INTERVAL 7 DAY 
        AND saledate >= CURDATE() - INTERVAL 14 DAY THEN Quantity 
        ELSE 0 END) Week2, 
     SUM(CASE WHEN saledate < CURDATE() - INTERVAL 14 DAY 
        AND saledate >= CURDATE() - INTERVAL 21 DAY THEN Quantity 
        ELSE 0 END) Week3 
    FROM (some subquery) 
    GROUP BY group,name 

訣竅是在sum函數中使用case語句來選擇合適星期的事務。

這是一個查詢的毛球。但它會起作用。

0

所以我有了這個代碼工作:...

SELECT Product.ProductGroupId, Product.Name, SUM(CASE WHEN Sale.SaleDateTime BETWEEN CURDATE() AND Sale.SaleDateTime <= (CURDATE() - INTERVAL 7 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week1, SUM(CASE WHEN Sale.SaleDateTime < (CURDATE() - INTERVAL 7 DAY) AND Sale.SaleDateTime >= (CURDATE() - INTERVAL 14 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week2, SUM(CASE WHEN Sale.SaleDateTime < (CURDATE() - INTERVAL 14 DAY) AND Sale.SaleDateTime >= (CURDATE() - INTERVAL 21 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week3, SUM(CASE WHEN Sale.SaleDateTime < (CURDATE() - INTERVAL 21 DAY) AND Sale.SaleDateTime >= (CURDATE() - INTERVAL 28 DAY) THEN SaleLine.Quantity ELSE 0 END) AS Week4
FROM Sale JOIN SaleLine ON Sale.ID = SaleLine.SaleId JOIN Product ON SaleLine.ProductId = Product.Id GROUP BY Product.ProductGroupId, Product.Name;

但我只是不知道如何做另一起案件中陳述,拿到Week1,Week2,譯員更加之間的平均,第4周

有什麼建議嗎?