Oracle数据透视查询用于以下面指定的格式显示结果

时间:2017-05-10 05:40:15

标签: oracle

我写了一个数据透视查询,如下所示。我在顶点使用此查询生成报告。在报告中,我们将两个日期选择器配置为开始日期和结束日期。根据用户输入的开始日期和结束日期,应生成一系列日期的许多动态列。虽然oracle中的pivot不允许在pivot的for子句中放置替换变量的子查询,但在顶点我可以使用替换变量。这就是我在查询中使用pivot的原因。请在下面找到查询:

SELECT *
FROM
  (SELECT PROCESSNAME,
    CASE
      WHEN STATUS=5
      THEN 'COMPLETED'
      WHEN STATUS=1
      THEN 'WAITING'
      WHEN STATUS=11
      THEN 'INVALID PRERUN'
      WHEN STATUS=10
      THEN 'STOP BY CONDITION'
      WHEN STATUS=6
      THEN 'STOPPED'
      WHEN STATUS=4
      THEN 'RUNNING'
      WHEN STATUS=7
      THEN 'STOP BY ERROR'
    END AS STATUS,
    TRUNC(startrundate) date1
  FROM EXPORT_TABLE
  WHERE TRUNC(startrundate) BETWEEN to_date('23-apr-2017','dd-mon-yyyy') AND to_date('25-apr-2017','dd-mon-yyyy')
  AND processname = 'JOB1'
  ORDER BY processname
  ) pivot ( COUNT(date1) FOR date1 IN ('23-apr-2017','24-apr-2017','25-apr-2017') )

- 这里我已经对日期进行了硬编码,但是在顶点生成时将其作为替换变量传递给我,我为此编写了一个动态生成日期范围的查询。

问题是,对于特定的作业,我想仅在一行中显示所有细节。但我上面的查询是分成不同状态的行。这是因为我在查询中考虑了状态。

PROCESSNAME          STATUS             23-APR-2017 24-APR-2017  25-APR-2017

 JOB1                STOP BY CONDITION     2             0          0

 JOB1                COMPLETED             0             1          0

理想情况下,我想要的是同一行中每天工作的状态,如下所示:

PROCESSNAME  23-APR-2017          24-APR-2017   25-APR-2017

JOB1    STOP BY CONDITION    COMPLETED      NA          

请让我知道实现这一目标需要做哪些更改。

谢谢和问候

1 个答案:

答案 0 :(得分:0)

这是一个版本,可以为您提供类似但不同的结果。而不是行中的状态,状态是行标题,其中作业达到状态的日期在行数据中。我在状态的日期使用MAX()。

SELECT *
FROM
  (with export_table(processname, status,startrundate) as
        (select 'JOB1', 10, to_date('04/23/2017','MM/DD/YYYY') from dual union all
         select 'JOB1', 10, to_date('04/24/2017','MM/DD/YYYY') from dual union all
         select 'JOB1', 11, to_date('04/24/2017','MM/DD/YYYY') from dual union all
         select 'JOB1', 5, to_date('04/25/2017','MM/DD/YYYY') from dual
        )
    SELECT PROCESSNAME,
    CASE
      WHEN STATUS=5
      THEN 'COMPLETED'
      WHEN STATUS=1
      THEN 'WAITING'
      WHEN STATUS=11
      THEN 'INVALID PRERUN'
      WHEN STATUS=10
      THEN 'STOP BY CONDITION'
      WHEN STATUS=6
      THEN 'STOPPED'
      WHEN STATUS=4
      THEN 'RUNNING'
      WHEN STATUS=7
      THEN 'STOP BY ERROR'
    END AS STATUS,
    TRUNC(startrundate) date1
  FROM EXPORT_TABLE
  WHERE TRUNC(startrundate) BETWEEN to_date('23-apr-2017','dd-mon-yyyy') AND to_date('25-apr-2017','dd-mon-yyyy')
  AND processname = 'JOB1'
  ORDER BY processname
  ) pivot ( max(date1) FOR status in ('COMPLETED','WAITING','INVALID PRERUN','STOP BY CONDITION','STOPPED','RUNNING','STOP BY ERROR'))