Fork me on GitHub

MySQL 依据两个元素进行分组并求其和

需求:三张表(购买记录表、票务信息表、人员信息表),查询某时间段内按周对男的、女的以及性别未知的三类人的充值金额合及其总金额进行分组查询(有点绕,白话叙述就是:查询某时间段内每个周中男、女、未知性别这三类人各个充值金额的和以及三者的和,嗯,不错,我觉得我叙述的很清楚了,哇卡卡卡🤣~,另:此示例中时间分组所使用的时间是时间戳,如果表中存的直接是日期的话只需要将下面SQL语句中的将FROM_UNIXTIME方法换成DATE_FORMAT方法即可),因此需要按照性别、周进行分组查询;


 

表:

  1、购买记录表(tt_user_live_buy):

  

 

  2、票务信息表(tt_user_live_sale):

  

  

  3、人员信息表(tt_user_info):

  

  

三张表中均有数据,并且数据能形成关联(即:购买记录表中的记录数据包含有用户表的用户ID及其票务信息的票务ID),另:用于演示因此表结构较简单;

 

 


SQL代码:

SELECT
    DATE_FORMAT( FROM_UNIXTIME( a.create_time ), '%Y-%u' ) AS t,
    sum( IF ( c.gender = '1', sale_price, 0 )) AS 'man',
    sum( IF ( c.gender = '0', sale_price, 0 )) AS 'woman',
    sum( IF ( c.gender = '', sale_price, 0 )) AS 'unknow',
    SUM( sale_price ) AS 'all'
FROM
    tt_user_live_buy a,
    tt_user_live_sale b,
    tt_user_info c 
WHERE
    a.user_id = c.user_id 
    AND a.sale_id = b.sale_id 
    -- AND a.create_time <= '1609218577' 
    -- AND a.create_time >= '1' 
    -- AND a.user_id = '1'
    -- AND c.gender = '1' 
GROUP BY t 

思路:其实关键点在于将男、女、未知性别三类数据放在同一条数据中返回(可以理解为将纵向三条数据转变为横向一条数据),实现此构想的SQL就是 sum( IF ( c.gender = '1', sale_price, 0 )) AS 'man', ,这句SQL就是说:计算 gender=‘1‘ 的数据的 sale_price 的值之和,并给定预设值为 0

WHERE语句中存在多个被注释掉的条件,在项目代码中根据情况而定是否使用;

 

 


 

运行得到的结果:

 

posted @ 2020-12-30 16:07  90后程序猿  阅读(643)  评论(0)    收藏  举报
/* 看板娘 */