如何将多行的结果聚合成一行 mysql
How to aggregate results from many rows into a single row mysql
我有一个订单 table,其中 OrderId 作为主键。我还有一个 Order_Products table,OrderId 为 FK。每个 Order_Product 行都有 Product_Name、Product_Status、Product_Delivery_Date 等列。table 以一对多关系连接到 OrderId。
我正在尝试设计一个将合并两个 table 的查询,这样我就可以为每个 OrderId 获取一行,但是该查询必须有一个包含 Oder_Name 的描述列连接所有 Order_Product 行的值;我还需要使用一些逻辑来计算聚合 Product_Status(如果其中一个产品是 'NotCompleted',那么聚合 Product_Status 将是 'NotCompleted'。最后我想计算 OrderDeliveryDate,使其成为所有 Order_Product Product_Delivery_Date 值的最小值。
我正在使用 MySql。你能给我一些关于如何完成这三个任务的建议吗?
示例:
订单表:
OrderId 客户名称
1001 个客户 X
OrderProducts 表:
Id OrderId ProductDescription ProductDeliveryDate ProductStatus
20 1001 产品 A 2015-01-30 未完成
21 1001 产品 B 2015-01-15 完成
24 1001 ProductC 2015-02-13 未完成
所需的查询输出:
OrderId CustomerName 描述 OrderDeliveryDate OrderStatus
'1001' 'CustomerX' 'ProductA,ProductB,ProductC' '2015-01-15' 'NotCompleted'
根据您的描述,如下查询可能会满足您的要求:
select o.*, op.status, op.orderdeliverydate, op.description
from orders o join
(select OrderId, group_concat(op.order_name) as description,
(case when sum(Product_Status = 'Not Completed') > 0 then 'Not Completed'
else 'Completed'
end) as Status,
min(Product_Delivery_date) as OrderDeliveryDate
from Order_Product
group by OrderId
) op
on o.OrderId = p.OrderId;
我有一个订单 table,其中 OrderId 作为主键。我还有一个 Order_Products table,OrderId 为 FK。每个 Order_Product 行都有 Product_Name、Product_Status、Product_Delivery_Date 等列。table 以一对多关系连接到 OrderId。
我正在尝试设计一个将合并两个 table 的查询,这样我就可以为每个 OrderId 获取一行,但是该查询必须有一个包含 Oder_Name 的描述列连接所有 Order_Product 行的值;我还需要使用一些逻辑来计算聚合 Product_Status(如果其中一个产品是 'NotCompleted',那么聚合 Product_Status 将是 'NotCompleted'。最后我想计算 OrderDeliveryDate,使其成为所有 Order_Product Product_Delivery_Date 值的最小值。
我正在使用 MySql。你能给我一些关于如何完成这三个任务的建议吗?
示例:
订单表:
OrderId 客户名称
1001 个客户 X
OrderProducts 表:
Id OrderId ProductDescription ProductDeliveryDate ProductStatus
20 1001 产品 A 2015-01-30 未完成
21 1001 产品 B 2015-01-15 完成
24 1001 ProductC 2015-02-13 未完成
所需的查询输出:
OrderId CustomerName 描述 OrderDeliveryDate OrderStatus
'1001' 'CustomerX' 'ProductA,ProductB,ProductC' '2015-01-15' 'NotCompleted'
根据您的描述,如下查询可能会满足您的要求:
select o.*, op.status, op.orderdeliverydate, op.description
from orders o join
(select OrderId, group_concat(op.order_name) as description,
(case when sum(Product_Status = 'Not Completed') > 0 then 'Not Completed'
else 'Completed'
end) as Status,
min(Product_Delivery_date) as OrderDeliveryDate
from Order_Product
group by OrderId
) op
on o.OrderId = p.OrderId;