SQL列转行、 分组后只显示一行、嵌套子查询SUM无法传值

前言

问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;

在这里插入图片描述

拓展

对于数字可以操作聚合函数,对于非数字如何操作?可参考方法三
可以尝试建立虚表,使用||等拼接返回。把整体看作一张表操作

未解决问题

如何不复杂查询,也可以实现一对多?
嵌套多层子查询,如何传参?如何优化?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值