SQL查询需求:将表中配送与取货列数据拆分至独立行
拆分配送与取货数据至独立行的SQL实现
现有数据库表中,每行同时包含配送(Delvr字段,值为1表示需要配送)和取货(Pickup字段,值为1表示需要取货)的布尔标识,需通过SQL查询将两种业务类型的数据拆分到独立行中:
- 新增
TripType列,标记该行是配送(Delivery)还是取货(Pickup) - 对应类型的日期填入
TripDate列,配送用DeliveryDate,取货用PickupDate
当前表结构及数据
| Order | NAME | Delvr | DeliveryDate | Pickup | PickupDate | QTY | Item Name |
|---|---|---|---|---|---|---|---|
| 198747 | Joe Dirt | 1 | 7/31/2023 | 1 | 8/4/2023 | 32 | Item 1 |
| 198747 | Joe Dirt | 1 | 7/31/2023 | 1 | 8/4/2023 | 20 | Item 2 |
| 198747 | Joe Dirt | 1 | 7/31/2023 | 1 | 8/4/2023 | 5 | Item 3 |
期望查询结果
| Order | NAME | TripType | TripDate | QTY | Item Name |
|---|---|---|---|---|---|
| 198747 | Joe Dirt | Delivery | 7/31/2023 | 32 | Item 1 |
| 198747 | Joe Dirt | Delivery | 7/31/2023 | 20 | Item 2 |
| 198747 | Joe Dirt | Delivery | 7/31/2023 | 5 | Item 3 |
| 198747 | Joe Dirt | Pickup | 8/4/2023 | 32 | Item 1 |
| 198747 | Joe Dirt | Pickup | 8/4/2023 | 20 | Item 2 |
| 198747 | Joe Dirt | Pickup | 8/4/2023 | 5 | Item 3 |
解决方案SQL
使用UNION ALL合并两个独立查询的结果,分别处理配送和取货的场景,同时过滤掉不需要生成行的记录:
-- 获取配送类型的行 SELECT "Order", NAME, 'Delivery' AS TripType, DeliveryDate AS TripDate, QTY, "Item Name" FROM your_table_name WHERE Delvr = 1 UNION ALL -- 获取取货类型的行 SELECT "Order", NAME, 'Pickup' AS TripType, PickupDate AS TripDate, QTY, "Item Name" FROM your_table_name WHERE Pickup = 1 ORDER BY "Order", NAME, TripType, "Item Name";
说明
UNION ALL保留所有符合条件的行,不会去重,适配拆分多行的需求WHERE子句确保只生成对应业务类型为真的行,若某行仅存在配送或取货标识,只会生成对应类型的行ORDER BY用于整理结果顺序,保证数据呈现整洁
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

