【问题标题】:SQL Query to split row values into separate columns with only one recordSQL查询将行值拆分为只有一条记录的单独列
【发布时间】:2018-01-29 14:21:55
【问题描述】:

我们的 Oracle 11g 数据库有一个跟踪文档更改的表,类似于以下内容:

ID  |     DATE     | STATUS_ID
203 |  10-02-2017  |   2
203 |  10-04-2017  |   3
168 |  08-15-2017  |   2
203 |  11-01-2017  |   4

我想了解如何根据上表的 date/status_id 创建 2 个带有记录的新列。上面的数据将被转换为以下状态(状态 2 = 打开,状态 4 = 关闭;我不需要任何其他状态):

ID  |   OPEN_DATE  |   CLOSED_DATE
203 |  10-02-2017  |  11-01-2017
168 |  08-15-2017  |    NULL

我认为这类似于 Excel 或 Access 中的数据透视表或交叉表查询,但我不确定如何处理。我想确保每个文档 ID 只有 1 行,并且适用的状态日期放在正确的列中。

我们将不胜感激。

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    有一个简单的选项可以避免连接成本、条件聚合...

    SELECT
      ID, 
      MIN(CASE WHEN status = 2 THEN date END)  AS DATE_OPEN, 
      MAX(CASE WHEN status = 4 THEN date END)  AS DATE_CLOSED
    FROM
      yourTable
    WHERE
      status IN (2, 4)
    GROUP BY
      ID
    

    【讨论】:

    • 这是完美的。非常感谢!
    【解决方案2】:

    试试这个。

    select t1.id, t1.date AS 'fromdate', t2.date AS 'todate'
    from 
        (SELECT id,date FROM `newtracker` WHERE status= 2) t1
    left join
        (SELECT id,date FROM `newtracker` WHERE status = 4) t2
    on
        t1.id = t2.id
    

    【讨论】:

      【解决方案3】:

      试试这个:

      select a.*,b.end_date
      from
      (select id,date as start_date
      from test
      where  status_id = 2 ) a
      left join
      (select id,date as end_date
      from test
      where  status_id = 4 ) b
      on a.id = b.id;
      

      如有任何疑问/解释,请告诉我。

      【讨论】:

        猜你喜欢
        • 2022-10-14
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多