mysql UNION all 实现不对称数据统计
当统计多条的三个参数在不同时间段的数据的sum,又只能写在同一个sql上时,可以考虑union all三次查询,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | select * from ( select kk.a_time as dates,kk.flag ,sum(kk.`参数一`) 参数一之和 ,sum(kk.`参数二`) 参数二之和 ,sum(kk.`参数三`) 参数三之和 from ( select k.a_time ,k.flag ,sum( case when p_time=0 or p_time= a_time then 1 else 0 end) as '参数一' , '' as '参数二' , '' as '参数三' from ( select a.pay_id ,o_days ,FROM_UNIXTIME(a_time/1000, '%Y-%m-%d' )a_time , case when p_time<>0 then FROM_UNIXTIME(p_time/1000, '%Y-%m-%d' ) else 0 end as p_time , case when mod(a.pay_id,2)=0 and l.pay_id is not null then '系统一' else '系统二' end as flag from pay a LEFT JOIN log l on a.pay_id = l.pay_id and l.`status` = 1 and type = 'baseinfo' where a_time>= UNIX_TIMESTAMP( '2018-07-23' )*1000 and a_time< UNIX_TIMESTAMP(DATE_ADD(CURDATE(),INTERVAL 1 DAY))*1000 +24*3600*1000 )k GROUP BY 1,2 UNION all select DATE_SUB(k.a_time,INTERVAL 1 day) a_time ,k.flag , '' as '参数一' , '' as '参数二' ,sum( case when p_time=0 or p_time = DATE_SUB(a_time,INTERVAL 1 DAY) or p_time= a_time then 1 else 0 end) as '参数三' from ( select a.pay_id ,o_days ,FROM_UNIXTIME(a_time/1000, '%Y-%m-%d' )a_time , case when p_time<>0 then FROM_UNIXTIME(p_time/1000, '%Y-%m-%d' ) else 0 end as p_time , case when mod(a.pay_id,2)=0 and l.pay_id is not null then '系统一' else '系统二' end as flag from pay a LEFT JOIN log l on a.pay_id = l.pay_id and l.`status` = 1 and type = 'baseinfo' where a_time>= UNIX_TIMESTAMP( '2018-07-24' )*1000 and a_time< UNIX_TIMESTAMP(DATE_ADD(CURDATE(),INTERVAL 1 DAY))*1000 +24*3600*1000 )k GROUP BY 1,2 union all select DATE_SUB(k.a_time,INTERVAL 1 day) a_time ,k.flag , '' as '参数一' ,sum( case when o_days>0 then 1 else 0 end) as '参数二' , '' as '参数三' from ( select a.pay_id ,o_days ,FROM_UNIXTIME(a_time/1000, '%Y-%m-%d' )a_time , case when p_time<>0 then FROM_UNIXTIME(p_time/1000, '%Y-%m-%d' ) else 0 end as p_time , case when mod(a.pay_id,2)=0 and l.pay_id is not null then '系统一' else '系统二' end as flag from pay a LEFT JOIN log l on a.pay_id = l.pay_id and l.`status` = 1 and type = 'baseinfo' where a_time>= UNIX_TIMESTAMP( '2018-07-24' )*1000 and a_time< UNIX_TIMESTAMP(DATE_ADD(CURDATE(),INTERVAL 1 DAY))*1000 +24*3600*1000 )k GROUP BY 1,2 )kk GROUP BY 1,2) kk -- where dates>={DATE1} and dates<={DATE2} |
该语句用了三次统计分别统计 参数一,参数二,参数三 的对应记录的dates,再做合并,有点好性能,只为满足需求的无奈之举!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗