如何为Shipment_INFO表添加Shipment_Size与Shipment_Ready计算列
解决方案:同时生成Shipment_Size和Shipment_Ready计算列
你可以通过两种方式整合两个计算列,以下是具体实现:
方式一:使用窗口函数(更简洁高效)
窗口函数无需额外关联子查询,直接在主查询中完成两个列的计算:
SELECT ShipmentID, ItemID, -- 统计当前ShipmentID下的物品数量 COUNT(*) OVER (PARTITION BY ShipmentID) AS Shipment_Size, -- 判断该运单是否所有物品均为Packed状态 CASE WHEN MAX(CASE WHEN Item_Status != 'Packed' THEN 1 ELSE 0 END) OVER (PARTITION BY ShipmentID) = 0 THEN 'Yes' ELSE 'No' END AS Shipment_Ready FROM Shipment_INFO;
方式二:基于你现有查询修改(关联子查询)
在你已有的子查询中新增All_Packed字段的计算,再在外层转换为Yes/No:
SELECT s.ShipmentID, s.ItemID, i.Shipment_Size, CASE WHEN i.All_Packed = 1 THEN 'Yes' ELSE 'No' END AS Shipment_Ready FROM Shipment_INFO s INNER JOIN ( SELECT ShipmentID, COUNT(*) AS Shipment_Size, -- 若所有物品都是Packed,MIN返回1;否则返回0 MIN(CASE WHEN Item_Status = 'Packed' THEN 1 ELSE 0 END) AS All_Packed FROM Shipment_INFO GROUP BY ShipmentID ) i ON i.ShipmentID = s.ShipmentID;
关键逻辑说明
- Shipment_Size:两种方式都是通过按
ShipmentID分组统计物品数量,窗口函数的PARTITION BY等同于子查询的GROUP BY。 - Shipment_Ready:核心是校验当前运单下所有物品的状态:
- 方式一中,用
MAX(CASE...)检测是否存在非Packed的物品,若存在则返回1,最终判断为No; - 方式二中,用
MIN(CASE...)确保所有物品都返回1(即状态为Packed),否则返回0,再转换为Yes/No。
- 方式一中,用
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

