我有以下数据库架构(重新映像),
我正在尝试编写一个返回结果的查询... (列标题): 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)
);
答案 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周之间的平均值
有什么建议吗?