sql - 将具有多个属性的行转换为每行具有一个属性的行
问题描述
我有一个如下形式的表格:
Id | Arrival | Departure | Expected Return
-------------------------------------------------
1 | 2019/8/2 | 2019/8/10 | 2019/8/15
2 | 2019/8/1 | 2019/8/15 | 2019/8/22
3 | 2019/8/2 | 2019/8/16 | 2019/8/21
但是,我需要一个返回类似这样的查询(理想情况下不定义其他函数)
Id | Action | Date
--------------------------------------
1 | Arrival | 2019/8/2
1 | Departure | 2019/8/10
1 | Expected Return | 2019/8/15
2 | Arrival | 2019/8/1
2 | Departure | 2019/8/15
2 | Expected Return | 2019/8/22
3 | Arrival | 2019/8/2
3 | Departure | 2019/8/16
3 | Expected Return | 2019/8/21
解决方案
使用 UNION ALL:
select Id, 'Arrival' "Action", Arrival Date from tablename
union all
select Id, 'Departure' "Action", Departure Date from tablename
union all
select Id, 'Expected Return' "Action", "Expected Return" Date from tablename
order by Id, Date
请参阅演示。
结果:
| id | Action | date |
| --- | --------------- | -----------|
| 1 | Arrival | 2019-08-02 |
| 1 | Departure | 2019-08-10 |
| 1 | Expected Return | 2019-08-15 |
| 2 | Arrival | 2019-08-01 |
| 2 | Departure | 2019-08-15 |
| 2 | Expected Return | 2019-08-22 |
| 3 | Arrival | 2019-08-02 |
| 3 | Departure | 2019-08-16 |
| 3 | Expected Return | 2019-08-21 |
编辑。
使用LATERAL
...VALUES
可能更有效(虽然不简单):
select t.id, v.*
from tablename t,
lateral (values
('Arrival', t.Arrival),
('Departure', t.Departure),
('Expected Return', t."Expected Return")
) v (Action, Date);
请参阅演示。
推荐阅读
- java - Android mvvm - 每个 crud 操作都应该有自己的 ViewModel 吗?
- jquery - stoptimer jquery中事件函数调用3次的问题
- java - 当我们说 Liferay 中的 Group 以及 Group 由什么组成时,这意味着什么?及其用途?
- javascript - 使用 postgresql 从 url 加载图像,但仅填充文本链接
- int - 查询 int 以在 cosmos db 中搜索?
- angular - 我在 Angular 7 中创建了一个库项目。我想在另一个项目中使用这个库项目而不发布。有什么办法吗?
- amazon-web-services - AWS Cognito Lambda 授权方 - 401 未经授权的错误
- c++ - Qt5Quickd.lib(Qt5Quickd.dll):致命错误 LNK1112:模块机器类型“x64”与目标机器类型“x86”冲突
- php - 如何使用工作代码在 php 中使用 Ajax 调用创建磁卡读卡器代码?
- django - non_field_errors,无效数据。DRF