oracle的 listagg() WITHIN GROUP () 根据字段多行字段合并

https://blog.csdn.net/qq_32448349/article/details/104531537

基础用法:LISTAGG(XXX,XXX) WITHIN GROUP( ORDER BY XXX),就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来

LISTAGG()其实可以把它当作SUM()函数来使用或者理解

针对上一个的查询SQL

SELECT * FROM 
(
SELECT TO_CHAR(CREATE_TIME,'yyyy-MM') CREATE_TIME,
PROJECT_TYPE,COUNT(*) SUM,
NULL COUNT_NUM from  
PROJECT_DECLARATION
GROUP BY TO_CHAR(CREATE_TIME,'yyyy-MM'),PROJECT_TYPE
)
PIVOT (SUM(SUM) NUM FOR PROJECT_TYPE IN ('projectType1' TYPE1,  'projectType2' TYPE2,'projectType3' TYPE3))
ORDER BY CREATE_TIME

结果

我又想把每行的汇总数字进行汇总count,于是我想到了union all,在上面的基础上添加一个关联查询 对月分组统计,SQL如下


SELECT * FROM (SELECT * FROM 
(
SELECT TO_CHAR(CREATE_TIME,'yyyy-MM') CREATE_TIME,
PROJECT_TYPE,COUNT(*) SUM,
NULL COUNT_NUM from  
PROJECT_DECLARATION
GROUP BY TO_CHAR(CREATE_TIME,'yyyy-MM'),PROJECT_TYPE
)
PIVOT (SUM(SUM) NUM FOR PROJECT_TYPE IN ('projectType1' TYPE1,  'projectType2' TYPE2,'projectType3' TYPE3))
ORDER BY CREATE_TIME)
--增加的
UNION ALL
select TO_CHAR(CREATE_TIME,'yyyy-MM') CREATE_TIME,
COUNT(*) COUNT_NUM,
NULL TYPE1_SUM,
NULL TYPE2_SUM,
NULL TYPE3_SUM 
FROM  PROJECT_DECLARATION
GROUP BY  TO_CHAR(CREATE_TIME,'yyyy-MM')

结果如下

我想把下面的三行COUNT_NUM 根据CREATE_TIME 合并列 就用到了我们今天的函数

 listagg() WITHIN GROUP () SQL如下

--增加的
SELECT CREATE_TIME,  
     LISTAGG( to_char(COUNT_NUM)) WITHIN GROUP(ORDER BY COUNT_NUM) AS COUNT_NUM,
		 LISTAGG( to_char(TYPE1_NUM)) WITHIN GROUP(ORDER BY TYPE1_NUM) AS TYPE1_NUM,  
		 LISTAGG( to_char(TYPE2_NUM)) WITHIN GROUP(ORDER BY TYPE2_NUM) AS TYPE2_NUM , 
		 LISTAGG( to_char(TYPE3_NUM)) WITHIN GROUP(ORDER BY TYPE3_NUM) AS TYPE3_NUM  
FROM 
(
--增加的

SELECT * FROM (SELECT * FROM 
(
SELECT TO_CHAR(CREATE_TIME,'yyyy-MM') CREATE_TIME,
PROJECT_TYPE,COUNT(*) SUM,
NULL COUNT_NUM from  
PROJECT_DECLARATION
GROUP BY TO_CHAR(CREATE_TIME,'yyyy-MM'),PROJECT_TYPE
)
PIVOT (SUM(SUM) NUM FOR PROJECT_TYPE IN ('projectType1' TYPE1,  'projectType2' TYPE2,'projectType3' TYPE3))
ORDER BY CREATE_TIME)

UNION ALL
select TO_CHAR(CREATE_TIME,'yyyy-MM') CREATE_TIME,
COUNT(*) COUNT_NUM,
NULL TYPE1_SUM,
NULL TYPE2_SUM,
NULL TYPE3_SUM 
FROM  PROJECT_DECLARATION
GROUP BY  TO_CHAR(CREATE_TIME,'yyyy-MM')

--增加的
) 
GROUP BY CREATE_TIME ORDER BY CREATE_TIME DESC

执行结果为

正是我们想要的,完美!!!!!

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Oracle中,LISTAGG函数是一个用于将数据进行分组并合并的函数。它有两种用法,可以作为分析函数或聚合函数。作为分析函数时,它可以与其他分析函数一起使用,如row_number()、rank()、dense_rank()等,语法为listagg(合并字段, 连接符) within group(order by 合并字段的排序) over(partition by 分组字段)。作为聚合函数时,它可以与其他聚合函数一起使用,如sum()、count()、avg()等,语法为listagg(合并字段, 连接符) within group(order by 合并字段排序) --后面跟 group by 语句。此外,对于Oracle字符串大小较小的情况,还可以使用正则替换方式去重,语法为regexp_replace(listagg(sfaaua001,',') within group(order by sfea002),'([^, )(,\\1)*(,|$)','\\1\\3') sfaaua001。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [OracleLISTAGG 函数的介绍以及使用](https://blog.csdn.net/weixin_45422361/article/details/118768731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [oracle中有关listagg函数的使用](https://blog.csdn.net/bananasssss/article/details/121712345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值