多个select中的子查询的相同部分

时间:2014-12-05 13:16:49

标签: sql oracle

我有一张这样的表

TABLEMAIN

Q1  Name  Group  Zone  Month  Type
1   'N1'  'G1'   'Z1'  12     'T1'
4   'N1'  'G3'   'Z2'  12     'T6'
6   'N1'  'G1'   'Z5'  12     'T2'
3   'N2'  'G4'   'Z5'  12     'T4'
.
.
.

我有这样的东西来获得某些结果

Query1:
select
(SUM(CASE Q1>=2 and Q1<=4 THEN 1 ELSE 0 END)) TOTAL,
(CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) T1TYPE,
(CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) T2TYPE,
Type,
**Zone,**
Month
from 
TABLEMAIN
GROUP BY Type, **Zone,** Month;

Query2:
select
(SUM(CASE Q1>=2 and Q1<=4 THEN 1 ELSE 0 END)) TOTAL,
(CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) T1TYPE,
(CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) T2TYPE,
Type,
**Group,**
Month
from 
TABLEMAIN
GROUP BY Type, **Group,** Month;

正如您所看到的,我在很多方面多次对此表进行分组,但这部分在每个查询中都是相同的

select
(SUM(CASE Q1>=2 and Q1<=4 THEN 1 ELSE 0 END)) TOTAL,
(CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) T1TYPE,
(CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) T2TYPE,

有更好的方法吗?我不确定我是否可以使用物化视图

2 个答案:

答案 0 :(得分:1)

也许。如果您愿意,可以使用grouping sets

在一个查询中完成所有操作
select SUM(CASE Q1>=2 and Q1<=4 THEN 1 ELSE 0 END) as TOTAL,
       (CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) as T1TYPE,
       (CASE WHEN Type = 'T1' THEN SUM(CASE WHEN Q1=4 THEN 1 ELSE 0 END)) as T2TYPE
       Type, **Zone,**, **Group,** Month
from TABLEMAIN
GROUP BY GROUPING SETS((Type, **Zone,** Month), (Type, **Group,** Month));

这会将所有结果放在一个表格中。

答案 1 :(得分:1)

我以@GolezTrol评论排在第二位。想进一步解释。

SUBQUERY FACTORING就是您所需要的。 WITH子句或子查询因子子句是SQL-99标准的一部分,并已添加到Oracle 9.2中的Oracle SQL语法中。 WITH子句可以作为内联视图处理或解析为临时表。后者的优点是重复引用subquery可能更有效,因为可以从临时表中轻松检索数据,而不是每个引用都需要。

WITH data AS(
<your subquery>
)
SELECT * FROM data
bla bla bla...