我正在使用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,依此类推。
我希望描述足够清楚。有谁知道怎么做?
答案 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