【问题标题】:Oracle Query based on data to horizontal [duplicate]Oracle Query 基于数据到水平 [重复]
【发布时间】:2020-03-01 13:00:50
【问题描述】:

我想查询以下这些数据样本。 (甲骨文数据库)

表名:FL_TEST

NAMA    JAM  STATUS
A       2    P
A       1    O
A       3    O
B       1    O
B       2    P
B       3    O
C       1    O
C       2    P
C       3    P

变成这样:

NAMA    JAM1 JAM2 JAM3
A       O    P    O
B       O    P    O
C       O    P    P

是否可以进行该查询?

【问题讨论】:

    标签: sql oracle pivot


    【解决方案1】:

    使用条件聚合

    select NAMA ,max(case when jam=1 then status end) as jam1,
    max(case when jam=2 then status end) as jam2,
    max(case when jam=3 then status end) as jam3
    from FL_TEST group by NAMA
    

    或者你可以使用枢轴

    SELECT *
      FROM FL_TEST
    PIVOT (
      MAX(status) as JAM FOR jam IN (1,2,3)
     );
    

    【讨论】:

    • JAM1、JAM2、JAM3 是自动从数据中来的怎么样?
    • @HiDayurieDave 需要动态 SQL
    • 有可能吗?我们无法手动处理 JAM。
    【解决方案2】:

    你可以使用Conditional Aggregation

    select nama, 
           max( case when jam = 1 then status end ) as jam1,
           max( case when jam = 2 then status end ) as jam2,
           max( case when jam = 3 then status end ) as jam3
      from tab
     group by nama
    

    pivot

    select * 
      from tab
     pivot(
           max(value) for field in ( 1 as "Jam1", 
                                     2 as "Jam2",
                                     3 as "Jam3" ) )
    

    Demo

    【讨论】:

    • JAM1、JAM2、JAM3如何自动取自数据?
    • 仅使用 Oracle 的 sql @HiDayurieDave 无法实现动态情况
    • 那是说我们需要使用另一个表还是在编程上做?
    • 它可以通过动态 SQL 计算出来,或者通过使用 PLSQL @HiDayurieDave 中的一些数组方法
    • 感谢兄弟编辑@Zaynul Abadin Tuhin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多