Sql 从同一个表中获取不同时间段的数据

Sql 从同一个表中获取不同时间段的数据,sql,oracle,Sql,Oracle,我需要根据另一列(在同一个表中)的日期值,从表中的两列中获取不同时间段的数据,比如今年和上一年。 我使用了两次相同的表,使用了不同的别名和联接,如下所示: SELECT NVL(SUM(a1.col1), 0) AS c1, NVL(SUM(a1.col2), 0) AS c2, NVL(SUM(a1.col3), 0) AS c3, NVL(SUM(a1.col4), 0) AS c4, NVL(SUM(a2.col1), 0) AS o1, NVL(SUM(a2.col2), 0) A

我需要根据另一列(在同一个表中)的日期值,从表中的两列中获取不同时间段的数据,比如今年和上一年。 我使用了两次相同的表,使用了不同的别名和联接,如下所示:

SELECT  
NVL(SUM(a1.col1), 0) AS c1,
NVL(SUM(a1.col2), 0) AS c2,
NVL(SUM(a1.col3), 0) AS c3, 
NVL(SUM(a1.col4), 0) AS c4,
NVL(SUM(a2.col1), 0) AS o1,
NVL(SUM(a2.col2), 0) AS o2,
NVL(SUM(a2.col3), 0) AS o3, 
NVL(SUM(a2.col4), 0) AS o4 ,
b.u_id
FROM

    (SELECT *
    FROM a
    WHERE to_char(run_date, 'YYYY') = to_char(SYSDATE, 'YYYY')
    ) a1,

    (SELECT *
    FROM a
    WHERE to_char(run_date, 'YYYY') = to_char(SYSDATE, 'YYYY') - 1
    ) a2,

    (SELECT u_id
    FROM b
    ) p

    WHERE a1.u_id (+) = b.u_id
    AND a2.u_id (+) = b.u_id
    GROUP BY b.u_id
还尝试通过限制只使用表一次来细化上述查询。 查询有点像这样:

SELECT     
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'),a.col1, 0)), 0) AS c1,
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'), a.col2, 0)), 0) AS c2,
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'), a.col3, 0)), 0) AS c3, 
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), to_char(SYSDATE, 'YYYY'), a.col4, 0)), 0) AS c4,
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col1, 0)), 0) AS p1,
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col2, 0)), 0) AS p2,
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col3, 0)), 0) AS p3, 
    NVL(SUM(DECODE(TO_CHAR(a.run_date, 'YYYY'), (to_char(SYSDATE, 'YYYY')-1), a.col4, 0)), 0) AS p4,
    b.u_id 

    FROM a, b

    WHERE to_char(a.run_date, 'YYYY') IN (to_char(SYSDATE, 'YYYY'),(to_char(SYSDATE, 'YYYY') - 1))
    AND a.u_id = b.u_id     
    GROUP BY b.u_id
对于大数据来说,这运行起来有点慢。你能提出其他问题吗。? 谢谢

我想换一下:

WHERE to_char(a.run_date, 'YYYY') IN (to_char(SYSDATE, 'YYYY'),(to_char(SYSDATE, 'YYYY') - 1))
致:

其中a.run\u date>=添加月份(trunc(sysdate,'YYYY'),-12)和
a、 运行日期<添加月份(trunc(sysdate,'YYYY'),12)

感谢您的回复。我猜你的建议应该会减少执行时间,因为日期比较比将日期转换为字符格式并进行比较要快。但是当我检查查询执行时间时,它几乎是相同的。比如说,我之前的查询在217秒内返回了结果。在用您的更改修改它之后,大约需要216.55秒。发布解释计划,该计划源于运行select*from table(dbms_xplan.display)。您需要查看是否有更好的计划可用,或者是否只需要为GROUPBY分配更高的内存。查询返回了多少行?此查询返回了大约30k行。实际上,这只是另一个很大的查询的一部分。此代码用作主查询中的一个选择表。
WHERE a.run_date >= add_months(trunc(sysdate,'YYYY'),-12) and
      a.run_date <  add_months(trunc(sysdate,'YYYY'), 12)