sql - 将具有少量列的 id 行复制到具有多列 Oracle SQL 的唯一 id 行
问题描述
我有一个可以有一到四个路灯的杆桌。每行都有一个灯杆 ID 和路灯类型(描述)。我需要 ID 是唯一的,每个可能的路灯都有一列。类型/描述可以是 26 个字符串中的任何一个。
我有这样的事情:
ID Description
----------------
1 S 400
1 M 200
1 HPS 1000
1 S 400
2 M 400
2 S 250
3 S 300
我需要的:
ID Description_1 Description_2 Description_3 Description_4
------------------------------------------------------------------
1 S 400 M 200 HPS 1000 S 400
2 M 400 S 250
3 S 300
在描述列中填充描述的顺序并不重要,例如对于 ID = 1,HPS 1000 值可能在描述列 1、2、3 或 4 中。因此,只要所有值都存在。
我试图调整它,但我认为这不是正确的工具。
select * from table t
pivot (
max(Description) for ID in (1, 2, 3))
因为有大约 3000 个 ID,我最终会得到一个大约 3001 行宽的表......
我也看了这个Oracle SQL Cross Tab Query但情况不太一样。
解决这个问题的正确方法是什么?
解决方案
您可以使用row_number()
条件聚合:
select
id,
max(case when rn = 1 then description end) description_1,
max(case when rn = 2 then description end) description_2,
max(case when rn = 3 then description end) description_3,
max(case when rn = 4 then description end) description_4
from (
select t.*, row_number() over(partition by id order by description) rn
from mytable t
) t
group by id
这最多可以处理 4 个描述id
。要处理更多,您可以select
用更多的条件扩展子句max()
。
推荐阅读
- flutter - 如何解决 - 列表中最初没有显示任何项目,同时使用 TextField 进行搜索,直到在 Flutter 中输入任何内容?
- php - 如何按产品价格搜索 Woocommerce WordPress
- python - 定义简单抽象属性的最优雅方式
- mysql - 为表创建好的索引
- vba - For Next 循环和边框颜色的奇怪行为
- mysql - 如何在 SELECT 函数的行内按某个值排序?
- symfony - 如何解决 Symfony 4 密码空错误?
- asp.net-mvc - IIS 中托管的 React.js ASP.NET MVC 核心应用程序无法读取 API(控制器)404
- c# - 使用 linq c# 进行联合
- python - 如何从方阵中获取有关元素降序的信息