2014-09-29 148 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