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

时间:2013-10-10 05:39:31

标签: 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) 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

这对于大数据来说运行速度有点慢。你能建议任何替代查询吗? 感谢

1 个答案:

答案 0 :(得分:1)

我改变了:

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

为:

WHERE a.run_date >= add_months(trunc(sysdate,'YYYY'),-12) and
      a.run_date <  add_months(trunc(sysdate,'YYYY'), 12)
相关问题