选择独立行并将它们显示为单行 (ORACLE SQL)

Posted

技术标签:

【中文标题】选择独立行并将它们显示为单行 (ORACLE SQL)【英文标题】:Selecting independent rows and displaying them into a single row (ORACLE SQL) 【发布时间】:2016-10-06 07:28:33 【问题描述】:

我有一个名为 requesttool.request_detail 的表,用于存储由 REQUEST_ID 列中的值标识的实体的属性。 requesttool.request_detail 表有一个名为 ATTRIBUTE_ID 的列,它指示存储在另一个名为 ATTRIBUTE_VALUE 的列的相应行中的内容。例如,如果给定行的 ATTRIBUTE_ID='259',则名称将存储在 ATTRIBUTE_VALUE 的相应行中。

这是 requesttool.request_detail 在实践中的样子:

我想要做的是提取存储在 ATTRIBUTE_VALUE 中的 3 个不同 ATTRIBUTE_ID 和给定 REQUEST_ID 的值,比如 4500161635,并将它们显示在一行中,如下所示:

我已经尝试了以下代码:

select
  request_id,
  case when attribute_id = '289' then attribute_value end as name,
  case when attribute_id = '259' then attribute_value end as country,
  case when attribute_id = '351' then attribute_value end as priority
from (
  select a.request_id, a.attribute_id, a.attribute_value
  from requesttool.request_detail a
  where a.request_id='4500161635');

但我从中获得了一个包含空值的表,而不是一行:

【问题讨论】:

您可以按 Request_id 分组并为所有 3 列选择 max(case ..)。 【参考方案1】:

你在正确的轨道上。只有你必须聚合你的行以便每个 request_id 获得一个结果行:

select
  request_id,
  max(case when attribute_id = '289' then attribute_value end) as name,
  max(case when attribute_id = '259' then attribute_value end) as country,
  max(case when attribute_id = '351' then attribute_value end) as priority
from requesttool.request_detail
where request_id = '4500161635'
group by request_id;

给定 request_id + attribute_id 上的索引,您可以通过在 where 子句中添加条件来加快速度:

and attribute_id in ('289', '259', '351')

顺便说一句:request_id 和 attribute_id 真的是字符串吗?或者你为什么在数字上使用引号?

【讨论】:

【参考方案2】:

试试这个

select
  request_id,
  MIN(case when attribute_id = '289' then attribute_value end) as name,
  MIN(case when attribute_id = '259' then attribute_value end) as country,
  MIN(case when attribute_id = '351' then attribute_value end) as priority
from (
     select a.request_id, a.attribute_id, a.attribute_value
     from requesttool.request_detail a
     where a.request_id='4500161635')
 GROUP BY request_id

【讨论】:

以上是关于选择独立行并将它们显示为单行 (ORACLE SQL)的主要内容,如果未能解决你的问题,请参考以下文章

使用多表子句将多个行值选择为单行

oracle入门之对表数据查询

将行拆分为多行 Oracle

有没有办法将“%”符号添加到我在 Oracle SQL 中的透视结果中并将它们转换为 to_char

Oracle 单列去重 显示单行所有列数据

SQLITE:如果它们共享一列,则将行合并为单行