硬聚合查询

时间:2014-09-29 11:11:10

标签: sql oracle

我正在使用Oracle SQL,我需要一些查询帮助。我不知道该怎么做。

我有下表(table_a):

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

每个文件可以多次发送同一抵押贷款。

从上表中我已经制作了下表(table_b):

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

此表包含来自table_a的前40个热门文档的全局计数(无论状态如何)。例如:

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

现在我需要创建下表:对于来自table_a的每个抵押,我需要为状态为“OK”的前40个文档中的每一个发送的文档计数。

例如:

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

Pop1 doc(最受欢迎的文件)已被发送50次,其中Mortgage_ID 123的状态为“OK”.Pop2已被发送21次,状态为“OK”,表示Mortgage_id 123,依此类推。

我希望描述足够清楚。有谁知道怎么做?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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