我有两个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
答案 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,则状态已完成,否则正在进行中。