前言
问1
分组后有多条数据,如何一列多值聚合在一起输出一行(数字)
问2
SELECT嵌套子查询SUM无法传值
如图:
select spsy.version_sales from SU_PRICE_STATE_YM spsy
where spsy.version_id = 370720
group by spsy.ym_id, spsy.version_sales
不可以直接聚合SUM 因为分组时包含多条,SUM会把分组前的数据聚合,得到的值不是有限列的总和
只想对这个结果集聚合求和
方法一
对结果集直接聚合,这是最简单高效的方式
但是在嵌套子查询中会有传值不进去情况,没有此种操作情景可以直接使用
select sum(version_sales)
from (select spsy.version_sales
from SU_PRICE_STATE_YM spsy
where spsy.version_id = 370720
group by spsy.ym_id, spsy.version_sales)
方法二
使用聚合函数嵌套聚合函数的方式
注:内层聚合依据自己需求选择合适的函数MAX MIN
此种方式可以解决嵌套子查询无法传值问题
select sum(avg(spsy.version_sales))
from SU_PRICE_STATE_YM spsy
where spsy.version_id = 370720
group by spsy.ym_id, spsy.version_sales
嵌套子查询类似于这样就可以传值
select A.*,
(select sum(avg(spsy.version_sales))
from SU_PRICE_STATE_YM spsy
where spsy.version_id = A.ID
group by spsy.ym_id, spsy.version_sales)
from A
这样写法不支持
select A.*,
(select sum(version_sales) from (select spsy.version_sales
from SU_PRICE_STATE_YM spsy
where spsy.version_id = A.ID
group by spsy.ym_id, spsy.version_sales) )
from A
原因是SUM阻隔了往第二层传值
方法三(23.03.28更新) 列转行
针对第二个方法第二层传参问题,如何解决?
理念为将多层传参转化为一层,如下
注:wm_concat
是ORACLE的早版本函数 新版本为LISTAGG
,这个函数特点是分组前执行,不加max
效果为,先执行了连接,后执行了分组,达不到预期,因为要去重;
-- 1000为传值切入点 一对多 预期转化为 一对一(拼接人名)
select wm_concat(max(TRFKZL_CN))
from TRFKZL
where 1 = 1
and TRFKZL_DWNM ='1000'
and TRFKZL_BLRQ > add_months(sysdate, -1)
group by TRFKZL_CN
加了max
后就会变为一行数据,达到预期一对多,转化为一对一(拼接);
用其他的分组方式,比如distinct
,则需要两层查询,单独写入wm_concat
也不支持;
select a,(嵌套) from b
MySql如何实现?
group_concat
函数即可
select group_concat((hsc.service_name))
from hit_service_catalog_config_items hscci
left join hit_service_config hsc on hscci.service_id = hsc.service_id;
拓展
对于数字可以操作聚合函数,对于非数字如何操作?可参考方法三
可以尝试建立虚表,使用||等拼接返回。把整体看作一张表操作
未解决问题
如何不复杂查询,也可以实现一对多?
嵌套多层子查询,如何传参?如何优化?