Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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-转换N行';将列值设置为1行中的N列_Sql_Oracle_Pivot - Fatal编程技术网

Oracle SQL-转换N行';将列值设置为1行中的N列

Oracle SQL-转换N行';将列值设置为1行中的N列,sql,oracle,pivot,Sql,Oracle,Pivot,与其他问题(例如“Oracle将行转换为列”)相比,这个问题的诀窍在于,我的列值是任意字符串,而不是可以用于解码的内容。以这个查询为例: 此处的描述表将人名映射到描述,但每个人可以有多个描述,例如“戴帽子”或“个子高” 在少于3个描述的情况下,我希望在那里为空。如果有3个以上的描述,我只想把它们删掉 我正在使用Oracle 11.1。这能有效地完成吗?假设您不关心描述返回的顺序(即Jeremy Smith可以正确地使用描述1或“混乱”以及描述2的“高”),您只需要关注行号。如果您关心返回说明的顺

与其他问题(例如“Oracle将行转换为列”)相比,这个问题的诀窍在于,我的列值是任意字符串,而不是可以用于解码的内容。以这个查询为例:

此处的描述表将人名映射到描述,但每个人可以有多个描述,例如“戴帽子”或“个子高”

在少于3个描述的情况下,我希望在那里为空。如果有3个以上的描述,我只想把它们删掉


我正在使用Oracle 11.1。这能有效地完成吗?

假设您不关心描述返回的顺序(即Jeremy Smith可以正确地使用
描述1
或“混乱”以及
描述2
的“高”),您只需要关注行号。如果您关心返回说明的顺序,则可以在分析函数的
行号中向窗口函数添加
order BY
子句

SELECT firstName, 
       lastName,
       MAX( CASE WHEN rn = 1 THEN description ELSE NULL END ) description1,
       MAX( CASE WHEN rn = 2 THEN description ELSE NULL END ) description2,
       MAX( CASE WHEN rn = 3 THEN description ELSE NULL END ) description3
  FROM (SELECT firstName,
               lastName,
               description,
               row_number() over (partition by lastName, firstName) rn
          FROM descriptions
               JOIN people USING (firstName, lastName)
         WHERE age >= 25)
   GROUP BY firstname, lastname

顺便说一句,我希望您实际上是在存储出生日期并计算此人的年龄,而不是存储年龄并假设人们每年都在更新他们的年龄。

我尝试过这个选项,但它说我们应该在行分析函数中按子句下订单,如下所示

row_number() over (partition by lastName, firstName order by lastName, firstName) rn
当我使用ORDERBY子句时,它在我的场景中运行良好

我的场景是用户详细信息在表A中,用户组在表C中,用户和用户组之间的关联在表B中。一个用户可以有多个用户组。我需要在一行中使用用户名和多个用户组获取结果

**

查询: **

**

查询结果 **


我不在乎点菜,所以我试试看。至于你的“旁白”,这个查询是一个简单的捏造,以避免包含我实际查询的许多细节:)我花了很长时间才弄明白如何使用它,但一旦我得到它,它就工作得很好(我被连接逻辑弄糊涂了——这种技术并没有显式的必要,它实际上就像给每一行一个行号,然后用行号来标识一行一样简单。)谢谢!
SELECT firstName, 
       lastName,
       MAX( CASE WHEN rn = 1 THEN description ELSE NULL END ) description1,
       MAX( CASE WHEN rn = 2 THEN description ELSE NULL END ) description2,
       MAX( CASE WHEN rn = 3 THEN description ELSE NULL END ) description3
  FROM (SELECT firstName,
               lastName,
               description,
               row_number() over (partition by lastName, firstName) rn
          FROM descriptions
               JOIN people USING (firstName, lastName)
         WHERE age >= 25)
   GROUP BY firstname, lastname
row_number() over (partition by lastName, firstName order by lastName, firstName) rn
SELECT username,
MAX( CASE WHEN rn = 1 THEN ugroup ELSE NULL END ) usergroup1,
MAX( CASE WHEN rn = 2 THEN ugroup ELSE NULL END ) usergroup2,
MAX( CASE WHEN rn = 3 THEN ugroup ELSE NULL END ) usergroup3, 
MAX( CASE WHEN rn = 4 THEN ugroup ELSE NULL END ) usergroup4,
MAX( CASE WHEN rn = 5 THEN ugroup ELSE NULL END ) usergroup5,
from (
select 
a.user_name username, 
c.name ugroup,
row_number() over (partition by a.user_name order by a.user_name) rn
from users a,
usergroupmembership b,
usergroups c
where a.USER_NAME in ('aegreen',
'esportspau'
)
and a.user_id= b.user_id
and b.group_id=c.group_id
)group by uname;
USERNAME    USERGROUP1  USERGROUP2  USERGROUP3  USERGROUP4  USERGROUP5
aegreen US_GOLF (null)  (null)  (null)  (null)
esportspau  EMEA - FSERVICE USER_ES_ES  EMEA-CR-ONLY    (null)  (null)