美文网首页
一个小问题~

一个小问题~

作者: 那只媛 | 来源:发表于2017-03-15 18:47 被阅读0次

问题描述

一个小伙伴提的问题,假设我有一张表:send_user,recv_user, send_times,分别代表:发送人、接收人、消息条数
我想算出一个人发送多少条消息,接受多少条消息,该怎么算啊?

希望得到的数据形式

user,send_times,recv_times
lily,100,11
someone,1000,100

解决

select xname,sum(send_times) as send_times,sum(recv_times) as recv_times
from
(
    select case when base.send_user is not null then base.send_user else base.recv_user end as xname,
    sum(case when base.send_user is not null then base.times else 0 end) as send_times,
    sum(case when base.send_user is null then base.times else 0 end) as recv_times
from(
    select send_user,recv_user, sum(recv_times) as times from tablename
    group by send_user,recv_user 
    grouping sets ((send_user),(recv_user))
    ) base
)temp
group by xname

原理

最内层的grouping sets的查询结果数据有如下格式,并且,第一列和第二列互斥,也就是说,第一列有值,第二列就没有值,第一列没有有值第二列就有值

send_user,recv_user, times
lily,null,100
null,lily,11
someone,null,1000
null,someone,100

由于两个列互斥,可以用case when来把前两列的值转到一列下,再通过互斥条件生成两个列,分别代表发送数和接收数,起到了行转列的作用,这时数据变成如下格式

xname, send_times, recv_times
lily,0,100
lily,11,0
someone,1000,0
someone,0,100

最外层再group by xname,来合并同名,分别sum后两列,由于上一步用0替代了互斥时不存在的值,所以sum(0)不会对值有影响,得到最后结果

xname, send_times, recv_times
lily,100,11
someone,1000,100

相关文章

  • 92/100 第二个小问题

    第一个小问题,是遇到一个不听话的下属, 第二个小问题,是旅游遇到的一些小问题。

  • 一个小问题

    今天在公司项目中遇到一个问题,一个网络请求的按钮,点击以后我没有禁用,用户一直点击,APP频繁的请求同一个接口,而...

  • 一个小问题

    我的浏览器在搭建好基本UI后运行还算正常。但添加了自动旋转代码后,开始报错。即使关闭Xcode,在模拟器上独立运行...

  • 一个小问题

    想问一下大家 大家都喜欢耽美吗 想些耽美的文章耶✌

  • 一个小问题

    前段时间心情糟糕,就随便翻阅kindle里面的书籍,偶然间看到胡适的文章,甚入心,最近一周都在看他的书。《一个问题...

  • 一个小问题~

    问题描述 一个小伙伴提的问题,假设我有一张表:send_user,recv_user, send_times,分别...

  • 一个小问题!

    都说神是万能的,他创造了宇宙,创造了人类,创造了世间万物。于是教徒于此深信不疑,神的地位于他们心中亦是无可置疑...

  • 一个小问题

    有个妹妹问我,感觉闺蜜的男朋友是个骗子,要不要告诉她? 我说你之前有跟她提过吗? 她摇头。 我说,一般我遇到这种情...

  • 一个小问题

    当用非conda方法安装bowtie2之后想看看是否安装成功 看了下应该是参数没指定改为bowtie2 -h就没问题了

  • 一个小问题

    今天我跟犀牛说,最近我有个学习的群,群里面有个活动就是请大家的孩子来提问,然后请群里的叔叔和阿姨回答。你有没有想要...

网友评论

      本文标题:一个小问题~

      本文链接:https://www.haomeiwen.com/subject/jrkrnttx.html