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

Sql Oracle在解码函数内的联接和子查询中选择一行,sql,oracle,subquery,decode,oracle9i,Sql,Oracle,Subquery,Decode,Oracle9i,我有两个Oracle(9i)表(EVENTS和EVENTS_元素)。表EVENTS有一个与ID\u EVENTO关联的PK(ID)作为FK(EVENTS\u元素) 在我的查询中,我想导出已完成或未完成的事件数(取决于events_元素中的值) 首先,我使用此查询获取每个事件的最后一行: SELECT * FROM EVENTS eve, EVENTS_ELEMENTS el WHERE eve.ID(+) = el.ID_EVENTO and ROWNUM = 1 ORDER BY ID des

我有两个Oracle(9i)表(EVENTS和EVENTS_元素)。表EVENTS有一个与ID\u EVENTO关联的PK(ID)作为FK(EVENTS\u元素)

在我的查询中,我想导出已完成或未完成的事件数(取决于events_元素中的值)

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

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,而不是每个带有last EVENTS\u ELEMENTS的事件都有一行带有Poncentaje值,我需要计算哪些事件已完成,哪些事件未执行

---------------------------------------------------------------------------------------------------------------------
| 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         |
---------------------------------------------------------------------------------------------------------------------
在此之后,我想计算已完成和未完成的数量。我试图理解解码功能。在本例中,我尝试得到以下结果:

---------------------------------
| 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

我认为这个问题符合您的需要:

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和状态分组,状态通过
解码功能进行计算:如果百分比为100,则状态已完成,否则状态正在进行中。

由于
rownum=1
的原因,您只能得到一个结果。它在结果集上运行,而不是在组/分区上运行。这只剩下一排了。值得注意的是,SELECT语句的最后一个求值部分是ORDERBY。这意味着您在ROWNUM上的条件是,给您留下一个随机行。接下来,您真正想要的是什么还不是很清楚。您的第一个结果是,您是否在寻找最小开始日期和最大结束日期?什么逻辑决定了返回的行。你的第二句话更让人困惑。为什么只完成一个?根据你自己的逻辑,他们似乎都是?还不清楚1的值是从哪里来的,它不应该是3和2吗?谢谢,我修改了查询(有点),现在它工作得很好<代码>选择ev.TIPO系列,解码(el.PORCENTAJE,100,‘已完成’、‘正在进行’)标签,计数(*)EVENTO_ELEMENTO el,EVENTOS ev的值,其中ev.ID=el.ID_EVENTO和ev.TIPO=‘模拟’组由ev.TIPO、ev.FECHAINICIO解码(el.PORCENTAJE,100,‘已完成’、‘正在进行中’)
现在我的表就像我之前说的:LABEL=完成/进行中(取决于PORCENTAJE值)SERIE=ev.TIPO值=完成/进行中的计数认真地说,谢谢,我被阻止了一周。
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')
;