2

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

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

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

4

1 回答 1

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)
于 2013-10-10T06:40:21.743 回答