mysql 分组后根据不同的条件返回不同的列

文章介绍了两种SQL方法来实现按日期汇总每天TEG/集团的UV,一种是通过联合查询,另一种是使用CASE语句重命名并分组求和。通过性能比较,使用CASE语句的方法在0.03秒内完成,比联合查询的0.11秒更快。
摘要由CSDN通过智能技术生成

日常场景中需要按照某个字段对不同行的数据进行汇总。

table: t_pv_uv_detailpage_count 表字段: belongLine:业务线 nowDate:日期 

要求: 按照要求展示每天 TEG/集团的UV(其他业务线的去除), 并展示在不同的列中

 方法一: 使用联合查询,按照日期联合查询

select a.uv as allUV, b.uv as tegUV, b.nowDate from 

(select * from t_pv_uv_detailpage_count where belongLine ='集团' )  a
left join  
(select * from t_pv_uv_detailpage_count where belongLine ='TEG')  b on a.nowDate=b.nowDate order by a.nowDate desc;

方法二:巧用多个case重命名为多列,同时巧用  else 0,以及sum的方式来分组

步骤1:  使用多个case 重命名

select nowDate ,
case WHEN belongLine ='TEG' THEN   uv 
else 0 end as tegUV,
case WHEN belongLine ='集团' THEN  uv 
ELSE 0  end as allUV 
from t_pv_uv_detailpage_count where (belongLine ='TEG' or belongLine ='集团') order by nowDate desc;

 步骤2:上面会出现null值  ,这时候可巧用else 0 的方式将 'null' 换为0

select nowDate ,
case WHEN belongLine ='TEG' THEN   uv 
else 0 end as tegUV,
case WHEN belongLine ='集团' THEN  uv 
ELSE 0  end as allUV 
from t_pv_uv_detailpage_count where (belongLine ='TEG' or belongLine ='集团') order by nowDate desc;

步骤3: 按照 newDate分组, 使用sum来聚合

select  sum(allUV), sum(tegUV), nowDate from (
select nowDate ,
case WHEN belongLine ='TEG' THEN   uv 
else 0 end as tegUV,
case WHEN belongLine ='集团' THEN  uv 
ELSE 0  end as allUV 
from t_pv_uv_detailpage_count where (belongLine ='TEG' or belongLine ='集团') order by nowDate desc
) as temp group by nowDate

以上两种sql都可以实现目标, 不过性能有所差别,使用explain查询

第一种联合查询,两次筛选 使用时长: 0.11s

 第二种临时表,一次全表筛选 0.03s

显然第二个更快一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值