我有以下数据库模式(重新图像),
我正在尝试编写一个查询,它会返回类似这样的结果...... (列标题):Product_Group - Product_Name - Week1 - Week2 - Week3 - Week4 - QTY_Order
第 1 周 是当前日期和前 7 天之间特定产品的所有销售额。
第 2 周 是 2 周前特定产品的所有销售额(因此介于当前日期 -7 天和当前日期 -14 天之间)
第 3 周 是特定产品从 3 周前的所有销售额...等;
QTY_Order 是第 1 周、第 2 周、第 3 周和第 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;
谁能指出我在 Week2 中哪里出了问题(它返回 Null)。
谁能想出更简单/更简洁的编码方式?
任何人都可以提供一些计算 QTY_Order 的指示吗?
提前感谢人们可以提供的任何帮助:-)
**编辑 - 按要求添加(不包括客户表):
创建表语句(还有各种触发器作为约束不包括在内)
创建表产品组(
Id int PRIMARY KEY AUTO_INCREMENT,
名称 varchar(50) NOT NULL
);
创建表产品(
Id int PRIMARY KEY AUTO_INCREMENT,
ProductGroupId 整数,
名称 varchar(100) NOT NULL,
价格小数(8,2),
QuantityOnHand int NOT NULL,
QuantitySold int NOT NULL,
QuantityToOrder int NOT NULL,
QuantityRequested int NOT NULL,
CONSTRAINT FK_Product_ProductGroup 外键 (ProductGroupId) REFERENCES ProductGroup(Id)
);
创建表销售(
Id int PRIMARY KEY AUTO_INCREMENT,
CustomerId 整数,
SaleDateTime 日期时间 NOT NULL,
约束 Sale_Customer FOREIGN KEY (CustomerId) REFERENCES Customer(Id)
);
创建表销售行(
Id int PRIMARY KEY AUTO_INCREMENT,
ProductId int NOT NULL,
SaleId int NOT NULL,
数量 int NOT NULL,
CONSTRAINT FK_SaleLine_Product 外键 (ProductId) 引用产品 (Id),
CONSTRAINT FK_SaleLine_Sale 外键 (SaleId) REFERENCES Sale(Id)
);
最佳答案
您正在从您的信息中寻找五个摘要:Week1、Week2、Week3、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
诀窍是在求和函数中使用 case 语句来选择适当周的交易。
这是一个毛团的查询。但它会起作用。
关于mysql - 来自多实体数据库的时间摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659728/