2014-09-29 120 views
0

我正在使用Oracle SQL,並且需要一些查詢幫助。我不知道該怎麼做。硬聚合查詢

我有如下表(table_a):

Mortgage_ID (int) 
Doc_ID (int) 
Status (varchar) 

每個文檔可以爲同一抵押多次發送。

從上表我做了如下表(table_b):

Rank (int) 
Document_type (int) 
Count (int) 

此表包含前40名流行的文件從table_a全球數(不考慮狀態)。例如:

Rank | Doc_ID | count 
-------------------------- 
1 | 212121 | 90 
2 | 555111 | 82 
3 | 4567654 | 76 
. | .  | . 
. | .  | . 
. | .  | . 
40 | 54321 | 22 

現在我需要創建下表:對於從table_a每宗按揭的,我需要已經派人與地位的前40名的文件中的每一個「OK」的文件計數。

例如:

Mortgage_id | Pop1 | Pop2 | Pop3 | ... | Pop40 
------------------------------------------------- 
    123  | 50 | 21 | 30 | ... | 6 
    555  | 70 | 0 | 21 | ... | 40 
    654  | 100 | 96 | 58 | ... | 0 

POP1 DOC(最流行的文件)已發出50次 「OK」 爲Mortgage_ID 123 POP2已發送21次,狀態爲 「OK」 的Mortgage_id狀態123等。

我希望描述足夠清楚。有誰知道如何做到這一點?

+1

這就是所謂的支點。根據您的Oracle版本,您可以使用PIVOT函數,也可以使用帶CASE表達式的聚合函數將行轉換爲列。 – Taryn 2014-09-29 11:15:24

+0

爲將來的問題閱讀[這](http://tkyte.blogspot.de/2005/06/how-to-ask-questions.html),請 – zaratustra 2014-09-29 11:32:45

回答

1

基本上,這是一個join合併兩個表,然後pivot。在這種情況下,我會使用條件聚合。所以,我認爲這是你在找什麼:

select a.mortgage_id, 
     sum(case when b.rank = 1 then 1 else 0 end) as pop1, 
     sum(case when b.rank = 2 then 1 else 0 end) as pop2, 
     . . . 
     sum(case when b.rank = 40 then 1 else 0 end) as pop40 
from table_b b join 
    table_a a 
    on b.doc_id = a.doc_id 
group by a.mortgage_id; 
+0

謝謝!我會嘗試的。 – Omri 2014-09-29 13:28:30

0

試試這個:

select * 
    from (select ta.Mortgage_ID, rank, cnt 
      from table_a ta, table_b tb 
     where ta.doc_id = tb.doc_id 
     ) 
pivot (
    sum(cnt) 
    for rank in (1 pop1,2 pop2,3 pop3,4 pop4,5 pop5) 
) 

MORTGAGE_ID  POP1  POP2  POP3  POP4  POP5 
----------- ---------- ---------- ---------- ---------- ---------- 
      1        20 
      2   40 
      5           10 
      4              5 
      3     30 

SQLFiddle

+0

謝謝!我會嘗試的。 – Omri 2014-09-29 13:28:51