通过在Oracle中分组一列从表中选择数据

Posted

技术标签:

【中文标题】通过在Oracle中分组一列从表中选择数据【英文标题】:Selecting the data from a table by grouping one column in Oracle 【发布时间】:2020-01-10 09:44:01 【问题描述】:

我有一张表T1如下图

ID PASSED   FAILED  PASSED_PERCENTAGE   FAILED_PERCENTAGE
-- ------   ------  -----------------   -----------------
1  380      172     50                  23 

我需要一个 SQL 查询,它会给出如下输出

DESC           ID        TOTAL         PERCENTAGE
----           --        -----         ----------
PASSED         1         380           50
FAILED         1         172           23

注意:T1 将始终只有一行,而列 ID 将始终具有恒定值 '1' 谁能帮我解决这个问题。非常感谢。

【问题讨论】:

【参考方案1】:

使用union all

select 'Passed' as 'desc', id, PASSED as total,PASSED_PERCENTAGE as PERCENTAGE
from tablename
union all
select 'Falied', id, Failed,FAILED_PERCENTAGE
from tablename

【讨论】:

你可能需要引号包裹DESC -> "DESC" 没有它你可能会得到一个错误。小提琴with 和without【参考方案2】:

Oracle 12C 支持横向连接,这是对子查询的改进(表只扫描一次):

select x.*
from t cross join lateral
     (select 'Passed' as which, id, passed as total, passed_percentage as percentage
      from dual
      union all
      select 'Failed' as which, id, failed as total, failed_percentage as percentage
      from dual
     ) x;

当然,对于这个示例数据样本,扫描不是性能问题——除非表确实是一个相当复杂的视图。

但是,横向连接非常强大,值得学习。

【讨论】:

以上是关于通过在Oracle中分组一列从表中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

使用其他表的列从表中删除

通过将表名作为参数传递,使用 oracle 中的存储过程从表中搜索数据

按列从表组中获取3行数据

推动从表中选择一列

从表中选择多个列,但按一个分组

如何在Oracle中添加一个策略,用户可以从表中选择所有数据,并且只能插入、更新、删除有条件的数据