2016-01-22 64 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子句中的值的作用类似于结果行之间的连接键。