2014-12-05 157 views
0

我有這樣同一部分選擇

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, 

有沒有更好的方式來做到這一點的一樣嗎?我不確定我是否可以使用物化視圖來製作這個

+0

把它放在一個遊標中,並將值存入一個變量並在每次select中使用該變量。所以在技術上你只會執行一次。 – Shankar 2014-12-05 13:20:17

+2

查看[WITH子句](http://www.dba-oracle.com/t_with_clause.htm)。 – GolezTrol 2014-12-05 13:23:26

回答

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

我第二次用@GolezTrol評論。想進一步解釋。

SUBQUERY FACTORING是你需要的。 WITH子句或子查詢因子子句是SQL-99標準的一部分,並已添加到Oracle 9.2中的Oracle SQL語法中。 WITH子句可以作爲內聯視圖處理或作爲臨時表解析。後者的優點在於對subquery的重複引用可能更有效,因爲數據很容易從臨時表中檢索出來,而不是由每個引用所要求的。

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