2016-05-23 182 views
-2

我有很多费用列的每个关键 表A优化Oracle查询

SK1 SK2 Col1中col2的COL3 ..... Col50 FLG(Y/N)


1 2 10 20 30 ...... 500 Y 
1 2 10 20 30 ...... 500 N 
2 2 10 20 30 ...... 500 N 

我需要聚合所有值(总和),然后检查是否有任何值与Y然后将它们添加到新的tableB。 这里应该返回表格A(sk1,sk2)的记录组合(1,2)。

我写的查询是选择所有列的lisr并添加为组。 我们有很多数据,所以这个查询需要很长时间才能运行。任何机会重新考虑这一点,并尽可能加快速度。

选择 SK1,SK2 , NVL从表A(总和(COL3),0), NVL(总和(COL4))0, ..... NVL(总和(col50)) group by Sk1, Sk2

Iam将此作为大型查询的一部分,其中许多其他计算都在此之上执行。

+1

而你的问题是? –

+0

我编辑了我的问题。让我知道你是否需要更多细节。 – waiting

回答

-1

如果您使用此作为大型查询的一部分,您尝试使用WITH选项吗?

这可能是这样的

WITH SUM_DATA AS (select col1, col2, nvl(sum(col3),0), nvl(sum(col4))0, ..... nvl(sum(col50)) from table A group by col1, col2) 

SELECT xyz 
FROM abc, sum_data 
WHERE abc.join_col = sum_data.join_col 

更多help here

+0

如果WITH子句只被引用一次,为什么会有帮助? –

0

工作的任何一个分组的记录集是否包含一个“Y”是那样简单......

select ... 
from  ... 
group by ... 
having max(flg) = 'Y' 
+0

这只会给我那些具有Y的值,我必须计算所有值的总和,然后仅显示或采用那些为Y的值 – waiting

+0

在应用聚合之后,having子句将过滤器应用于查询结果,而不是输入行。因此它将返回所有源行的flg的最大值为“Y”的聚合行。 –

0

现在我已经创建了一个临时表并将所有数据加载到它中。