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