Oracle在解码函数中选择连接和子查询中的一行

时间:2014-04-25 10:24:42

标签: sql oracle subquery decode oracle9i

我有两个Oracle(9i)表(EVENTS和EVENTS_ELEMENTS)。 TABLE EVENTS有一个与ID_EVENTO关联的PK(ID)为FK(EVENTS_ELEMENTS)。

Table EVENTS
    ----------------------------------
    | ID | TIPO | FECHAINICIO        |
    ----------------------------------
    | 23 | real | dd/mm/yyyy hh:mm:ss|
    | 97 | real | dd/mm/yyyy hh:mm:ss|
    ----------------------------------

Table EVENTS_ELEMENTs
    -----------------------------------------------------------------------------------
    | ID_EVENTO | FIN_PREVISTO        | FIN_REAL           | PORCENTAJE | ID_ELEMENTO |
    -----------------------------------------------------------------------------------
    | 23        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 100        | 731         |
    | 23        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 100        | 732         |
    | 23        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 73         | 733         |
    | 97        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 100        | 840         |
    | 97        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 100        | 841         |
    -----------------------------------------------------------------------------------

在我的查询中,我想导出已完成或不完整的事件数(取决于EVENTS_ELEMENTS中的值PORCENTAJE)。

首先,我使用此查询获取每个事件的最后一行:

SELECT *
FROM EVENTS eve, EVENTS_ELEMENTS el
WHERE eve.ID(+) = el.ID_EVENTO and ROWNUM = 1
ORDER BY ID desc

试图获得这个结果:

---------------------------------------------------------------------------------------------------------------------
| ID | TIPO | FECHAINICIO        |  ID_EVENTO | FIN_PREVISTO        | FIN_REAL           | PORCENTAJE | ID_ELEMENTO |
---------------------------------------------------------------------------------------------------------------------
| 23 | real | dd/mm/yyyy hh:mm:ss|  23        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 73         | 733         |
| 97 | real | dd/mm/yyyy hh:mm:ss|  97        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 100        | 841         |
---------------------------------------------------------------------------------------------------------------------

但是我的结果只有EVENT的一行,而不是每一个EVENT_ELEMENTS行的最后一行都带有PORCENTAJE值我需要计算什么事件已经完成以及什么是未执行。

---------------------------------------------------------------------------------------------------------------------
| ID | TIPO | FECHAINICIO        |  ID_EVENTO | FIN_PREVISTO        | FIN_REAL           | PORCENTAJE | ID_ELEMENTO |
---------------------------------------------------------------------------------------------------------------------
| 23 | real | dd/mm/yyyy hh:mm:ss|  23        | dd/mm/yyyy hh:mm:ss |dd/mm/yyyy hh:mm:ss | 73         | 733         |
---------------------------------------------------------------------------------------------------------------------

在此之后,我想计算已完成和未完成的数量。我试图了解DECODE功能。在这个例子中,我尝试得到结果:

---------------------------------
| LABEL    | SERIE      | VALUE |
---------------------------------
| COMPLETO | Serie-Text | 1     |
| EJECUCION| Serie-Text | 1     |
---------------------------------
if PORCENTAJE == 100 -> COMPLETO
if PORCENTAJE != 100 -> EJECUCION

我认为第二个查询应该是:

SELECT DECODE (EVENTS,
                  (SELECT count(*)
               FROM [Query of first question]), 'COMPLETO',
              (SELECT count(*)
               FROM [Similar Query of first question]), 'EJECUCION') as LABEL,
    'Serie-Text' as SERIE,
    count(ev.ID) as VALUE
FROM EVENTS ev, EVENTS_ELEMENTS el
WHERE ev.ID(+) = el.ID_EVENTO

1 个答案:

答案 0 :(得分:0)

我认为此查询符合您的需求:

select ev.ID, ev.TIPO, evFECHAINICIO,
       decode(ev.PORCENTAJE, 100, 'COMPLETED', 'IN PROGRESS') status, count(*) nb
from EVENTS_ELEMENTS el, EVENTS ev
where ev.ID = el.ID_EVENTO
group by ev.ID, ev.TIPO, evFECHAINICIO,
      decode(ev.PORCENTAJE, 100, 'COMPLETED', 'IN PROGRESS')
;

我按ID和状态进行分组,感谢decode函数计算状态:如果百分比为100,则状态已完成,否则正在进行中。