在DBeaver中使用SQL查询合并同一ID的收发地址行
同一ID发货/收货信息合并的SQL实现方案
需求说明
原数据中同一追踪ID的发货(From)、收货(To)信息分属两行,需将其合并为一行,同时保留发货地城市、州和收货地城市、州信息。
原数据表结构及数据
| ID | Type | City | State |
|---|---|---|---|
| 1234 | From | CA | ABC |
| 1234 | To | WA | XYZ |
目标数据表结构
| ID | From City | From State | To City | To State |
|---|---|---|---|---|
| 1234 | CA | ABC | WA | XYZ |
方法一:自连接(Self Join)
通过ID将原表自身关联,分别筛选出发货和收货记录后合并字段。
CREATE TABLE new_table AS SELECT f.ID, f.City AS `From City`, f.State AS `From State`, t.City AS `To City`, t.State AS `To State` FROM original_table f INNER JOIN original_table t ON f.ID = t.ID WHERE f.Type = 'From' AND t.Type = 'To';
说明:
- 替换
original_table为你的原表名称,new_table为要创建的新表名称 - 若仅需查询结果而非创建新表,移除
CREATE TABLE new_table AS语句即可
方法二:条件聚合(Conditional Aggregation)
通过CASE WHEN结合聚合函数,按ID分组提取对应类型的字段值,兼容性更强,适用于多数数据库。
CREATE TABLE new_table AS SELECT ID, MAX(CASE WHEN Type = 'From' THEN City END) AS `From City`, MAX(CASE WHEN Type = 'From' THEN State END) AS `From State`, MAX(CASE WHEN Type = 'To' THEN City END) AS `To City`, MAX(CASE WHEN Type = 'To' THEN State END) AS `To State` FROM original_table GROUP BY ID;
说明:
- 由于同一ID对应
Type='From'和Type='To'各一条记录,使用MAX聚合函数可精准提取唯一值 - 同样可替换表名实现创建新表或仅查询结果
内容的提问来源于stack exchange,提问作者Akshay Shinde
相关产品推荐
相关产品推荐

