【发布时间】:2017-04-10 14:41:45
【问题描述】:
+-----------+------------+-----------+-----------+
| Person_ID | First_Name | Last_Name | Igroup_ID |
+-----------+------------+-----------+-----------+
| 2 | Rick | Hudson | 100 |
| 2 | Rick | Hudson | 50 |
| 2 | Rick | Hudson | 28 |
| 2 | Rick | Hudson | 15 |
| 3 | John | Hardy | 150 |
| 3 | John | Hardy | 100 |
| 4 | Tom | Johnson | 200 |
| 4 | Tom | Johnson | 150 |
| 4 | Tom | Johnson | 100 |
+-----------+------------+-----------+-----------+
请参考上表使用操作 LISTAGG 背后的原因,我得到多行 Person ID 因为我每个人都与多个 Group ID 相关联,所以我想使用 LISTAGG 连接 Group ID 并隔离值.
而且由于IGROUP值有这么多每个人都可以关联的值,但是我们担心前2个值,在屏幕截图中
当某物返回 100|50 时 'GroupA' 当某事返回 150|100 则 'GroupB' 当某些东西返回 200|150 Then 'GroupC'
(CASE LISTAGG(G.IGROUP_ID , '|') WITHIN GROUP (ORDER BY G.igroup_id)
WHEN '100|50' THEN 'GroupA'
WHEN '150|100' THEN 'GroupB'
WHEN '200|150 THEN 'GroupC'
END) AS SERVICES
但这里的问题是,如果我使用上述方式,我必须在 CASE 语句中定义所有组合
有什么方法可以使用WHEN LIKE '100|50%' THEN GroupA
【问题讨论】:
-
我必须说这个问题/方法感觉有些不对劲。我强烈建议您为整个查询/问题添加一个新问题
-
还是不清楚。(1)你只关心50,100,150和200吗?这些价值观有什么特别之处?其他值呢? (2) 你打算如何处理结果? (3) 在您原来的问题中,每个人 ID 可能会出现多次组 ID,它怎么会出现在这个数据结构中? (4)为什么数据一开始就没有归一化?为什么除了人名之外还有名字?我认为,如果您给出全貌,解决方案将完全不同。附:请将图片替换为文字(可以ctrl+k格式化)
-
1) 不是那样,我只是让它很容易理解。 2)那些价值观是人的技能,我需要根据技能来隔离这个人,例如,如果他有 50 和 100,他属于一个组 3)组 ID 是一种技能,人可以拥有多种技能(但是如果他满足 2 个技能,我可以识别 GroupA、GroupB、GroupC 技能)4)我没有保留这个选项,当然我会工作并用文字替换图片
-
我唯一的意图是我会得到很多像下面这样的组合,但是当我做 LISTAGG 操作时,我得到的值如下。所以不要每次都写 WHEN 语句。我想使用 WHEN LIKE ( 50|100%) Then GroupA
标签: sql oracle sql-like listagg