oracle 查询项目及其事件的年度结果

igsr9ssn  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(81)

我有一个SQL语句,它查询一个项目是否存在于一年之内:

SELECT 
    t.item_type_code,
    t.item_id
FROM   
    ITEM_TABLE t
WHERE
    extract(year from t.issue_date) =< 2022 AND
    extract(year from t.termination_date) => 2022

我现在想看看在这些项目上发生的一些事件。我想计数的事件发生在该项目的每一年,它存在。

换句话说:

1.查询给定年份中存在的项目
1.获取给定年份中这些项目上发生的事件计数。
以下查询将返回该信息:

WITH items AS
(      
    SELECT 
        t.item_type,
        t.item_id
    FROM   
        ITEM_TABLE t
    WHERE
        extract(year from t.issue_date) <= 2022 AND
        extract(year from t.termination_date) => 2022
)
SELECT
    t.item_type,
    COUNT(event_id)
FROM
    items t 
INNER JOIN
    events_xref x ON t.item_id = x.item_id
INNER JOIN
    events ON x.event_id = e.event_id
WHERE
    extract(year from e.effective_date) = 2022
GROUP BY
    t.item_type

我想做的不是硬编码这些年。我想每年查询并返回相同的信息。有人能建议如何做到这一点吗?

编辑

我被要求澄清更多。所以,假设你的工作是颁发驾驶执照。每个许可证都有一个生命周期,从发布到到期。此外,许可证可以随着时间的推移记录许多事件。例如,发行是一个事件。超速罚单(或任何其他违规行为)是一个事件。许可证到期是一个事件,等等。
item表包含有关许可证的信息。ID、签发日期和失效日期
event表存储每个许可证上发生的事件,包括event_id、事件类型和事件日期。
events_xref表仅用作连接上述2个表的交叉引用表,并且仅包含item_idevent_id
我被要求提供的是:
1.首先,收集给定年份中存在的所有许可证的列表(即,如果其发行日期在该年内或之前,且其到期日期在该年内或之后)
1.获取该列表并计算该列表中在同一给定年份发生的所有事件
1.我需要报告过去75年左右的情况,所以我每年都需要这样做。
我提供的查询确实满足了我的需要,但我必须重新设置它,并更改您每次在查询中看到的3个位置的年份,以获取最近75年的数据。我希望能让调查组来处理这个问题

i2loujxw

i2loujxw1#

看起来你想使用一个行生成器来生成年份,然后GROUP BY生成年份以及item_type

SELECT EXTRACT(YEAR FROM y.year) AS year,
       t.item_type,
       COUNT(e.event_id)
FROM   ( SELECT ADD_MONTHS(TRUNC(SYSDATE, YY), 12 * (1 - LEVEL))
         FROM   DUAL
         CONNECT BY LEVEL <= 75
       ) y
       INNER JOIN item_table t
       ON     t.issue_date       <  ADD_MONTHS(y.year, 12)
          AND t.termination_date >= y.year
       INNER JOIN events_xref x
       ON t.item_id = x.item_id
       INNER JOIN events e
       ON x.event_id = e.event_id
GROUP BY
       t.item_type,
       y.year;

相关问题