mysql - 来自多实体数据库的时间摘要

标签 mysql

我有以下数据库模式(重新图像),Database Schema

我正在尝试编写一个查询,它会返回类似这样的结果...... (列标题):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/

相关文章:

具有空白/空值的 MySQL JOIN 不返回任何结果

php - 用于获取未提交特定一周时间的用户数据的 SQL 查询?

mysql - 使用 'END as' 语句从动态生成的列名中选择不为空的字段

mysql - 阻止字段更新的触发器不起作用,行为怪异

MySQL 不等于吗?

mysql - Hibernate 和 MySQL 5.6 的奇怪 DATETIME 行为

php - 使用 PHP 添加到 MySQL 数据库

MySQL - 强制不使用缓存来测试查询速度

php - 基于字符串 "1,5,3,7"的 SQL 查询 -> 保持结果顺序

mysql - 如何在 Windows 上更改 MySQL 数据目录?