Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL折叠数据行_Sql_Oracle_Group By - Fatal编程技术网

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;