Oracle SQL折叠数据行
查询到的数据当前返回如下:Oracle SQL折叠数据行,sql,oracle,group-by,Sql,Oracle,Group By,查询到的数据当前返回如下: UserName Op1 Op2 Op3 -------- --- --- --- User1 1 0 0 User2 1 1 1 User3 1 1 0 结果应仅为一行: Ops1
UserName Op1 Op2 Op3
-------- --- --- ---
User1 1 0 0
User2 1 1 1
User3 1 1 0
结果应仅为一行:
Ops1 Ops2 Ops3
---- ---- ----
User1, User2, User3 User2, User3 User2
我如何在Oracle中做到这一点?这里有一种方法-使用
listag()
(我认为它需要Oracle 11.2版或更高版本):
这里有一种方法-使用
listag()
(我认为它需要Oracle 11.2版或更高版本):
如果数字为1,您可以使用输出用户名,否则输出空单词。将名称连接为
如果数字为1,您可以使用输出用户名,否则输出空单词。将名称连接为
您使用的是什么数据库管理系统?请编辑标签。这是一种非常奇怪的存储和显示数据的方式。请规范化你的模式…我无法控制模式。好吧,这是可以理解的。不过,建议某人这样做还是不错的:)什么决定了字符串聚合的顺序?为什么
'User2,User3'
而不是'User3,User2'
?它是按字符串本身的字母顺序排列的吗?您使用的是什么数据库管理系统?请编辑标签。这是一种非常奇怪的存储和显示数据的方式。请规范化你的模式…我无法控制模式。好吧,这是可以理解的。不过,建议某人这样做还是不错的:)什么决定了字符串聚合的顺序?为什么'User2,User3'
而不是'User3,User2'
?它是按字符串本身的字母顺序排列的吗?谢谢。我想这也行,但我喜欢MathGuy的答案。谢谢。我想这也行,但我喜欢MathGuy的答案。
with
test_data ( username, op1, op2, op3 ) as (
select 'User1', 1, 0, 0 from dual union all
select 'User2', 1, 1, 1 from dual union all
select 'User3', 1, 1, 0 from dual
)
select listagg(case op1 when 1 then username end, ',')
within group (order by username) as ops1,
listagg(case op2 when 1 then username end, ',')
within group (order by username) as ops2,
listagg(case op3 when 1 then username end, ',')
within group (order by username) as ops3
from test_data
;
OPS1 OPS2 OPS3
------------------ ------------------ ------------------
User1,User2,User3 User2,User3 User2
SELECT LISTAGG(DECODE(OP1, 1, USERNAME, ''), ',') WITHIN GROUP (ORDER BY USERNAME) OPS1,
LISTAGG(DECODE(OP2, 1, USERNAME, ''), ',') WITHIN GROUP (ORDER BY USERNAME) OPS2,
LISTAGG(DECODE(OP3, 1, USERNAME, ''), ',') WITHIN GROUP (ORDER BY USERNAME) OPS3
FROM ELBAT;