来自多实体数据库

时间:2016-09-23 11:31:24

标签: mysql

我有以下数据库架构(重新映像),Database Schema

我正在尝试编写一个返回结果的查询... (列标题): Product_Group - Product_Name - 第1周 - 第2周 - 第3周 - 第4周 - QTY_Order

第1周是当前日期与前7天之间特定产品的所有销售额。 第2周是2周前特定产品的所有销售额(因此在当前日期-7天和当前日期-14天之间) 第3周是3周前特定产品的销售额......等等; QTY_Order 是第1周,第2周,第3周和第3周特定产品销售的平均值。 Week4。

以下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返回所有null。

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;

任何人都可以指出我在第二周出现问题的地方(它返回Null) 任何人都可以想到更简单/更清洁的方式来编码吗? 任何人都可以提供一些计算QTY_Order的指针吗?

提前感谢人们提供的任何帮助: - )

**编辑 - 按要求添加(不包括客户表):
创建表语句(还有各种触发器作为不包括的约束)

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) );

2 个答案:

答案 0 :(得分:1)

您正在寻找您的信息中的五个摘要:第1周,第2周,第3周,第4周和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语句来选择适当周的事务。

这是一个查询的毛球。但它会奏效。

答案 1 :(得分: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;

但我只是不确定如何做另一个Case语句,以获得第1周,第2周,第3周,第4周之间的平均值

有什么建议吗?