2016-01-22 62 views
0

我有一個查詢可以生成一個人在一年內捐贈的名稱和總金額列表。它看起來像這樣多列查詢到單列子查詢

select ad1.adbdesg_name as "Desg_Name", 
sum(ag1.agvglst_amt) as "Total_Amt" 
from agvglst ag1 INNER JOIN adbdesg ad1 ON ag1.agvglst_desg = ad1.adbdesg_desg 
where ag1.agvglst_pidm = 12345 
and to_char(ag1.agvglst_gift_date,'YYYYMMDD') >= 20150101 
and to_char(ag1.agvglst_gift_date,'YYYYMMDD') <= 20151231 
group by ad1.adbdesg_name; 

簡單的權利?而我得到正確的結果是這樣的:

Desg_Name           Total_Amt 
Administrative Council Scholarship End Prin NS (65%) 16.9 
Blount County Campus          240 
Administrative Council Scholarship (35%)     9.1 
Faculty Senate Scholarship        10 

我的問題,現在我需要爲單行子查詢,將它放在報告中,他們希望每個人一時間,看看他們的捐款數額。

我做了一些研究想法也許我可以嘗試使用listagg函數來實現此目的,但我不相信您可以使用這種聚合函數,因爲不允許使用組函數。

select listagg('DESG: '|| adbdesg_name as "Desg_Name" ||' AMT: $' || sum(AGVGLST_AMT), ',') 
WITHIN GROUP (ORDER BY AGVGLST_GIFT_DATE) "DesgHC2015" 

任何建議/提示,將不勝感激:)

回答

1

只是包裝在另一個查詢您的查詢,將做聚合:

SELECT listagg(total, ',') WITHIN GROUP (ORDER BY adbdesg_name) AS DesgHC2015 
FROM (
    select ad1.adbdesg_name, 
     'DESG: '|| ad1.adbdesg_name || ' AMT: $' || sum(ag1.agvglst_amt) as total 
    from agvglst ag1 
     INNER JOIN adbdesg ad1 
     ON ag1.agvglst_desg = ad1.adbdesg_desg 
    where ag1.agvglst_pidm = 12345 
    and EXTRACT(YEAR FROM ag1.agvglst_gift_date) = 2015 
    group by ad1.adbdesg_name 
) 
+0

這正是我需要!我曾試過這個,但我做了倒退。謝謝! –

+0

我也想感謝您使用EXTRACT功能。我完全忘記了這件事 –

0

LISTAGG將多行合併列值,你可以在這種情況下使用它,但是從我所看到的你想擁有這首

SELECT 'DESG: '|| adbdesg_name || ' AMT: $' || Total_amt as Descg_name FROM yourtable 

這樣,您將得到列合併,現在你可以使用LISTAGG這樣的:

SELECT LISTAGG(Descg_name,',') WITHIN GROUP (ORDER BY AGVGLST_GIFT_DATE) 
FROM yourtable 

注意:WIT​​HING GROUP中的order by子句中的值的作用類似於結果行之間的連接鍵。