只有在分组统计中才会使用group by ,这个分组统计有两个涵义:第一必须是分组,不以组归类就无所谓group by,group by的意思就是以组为单位。第二,必须是计算,而且必须是按组计算。 如 计算每个班级多少人: select class,count(*) from students group by class;按班级计算,每个班级有多少人。(正确) select class,grade from students group by class;(错)没有统计计算
今天遇到一个问题,就是计算总点击量时会有重复记录,用distinct删除重复行后在用sum求和,但是被删除的行的数据依然加到了sum的总数里。
解决办法就是利用一个派生的表,然后从派生表里计算sum总数,这样被distinct山删除的行的信息就不会被加到sum里。
语句如下:
#一定要借助派生表来计算总点击量,否则sum总会计算重复的行数据 select cp_id,cp_name,datatype_id,datatype_name,sum(total_times) AS total_times from (select DISTINCT(`t1`.`info_id`), `t2`.`cp_id` AS `cp_id`, `t2`.`cp_name` AS `cp_name`, substring_index(`t1`.`data_type`, '/', 1) AS `datatype_id`, substring_index(`t1`.`data_type`, '/', 1) AS `datatype_name`, ifnull(`t3`.`TotalTimes`, 0) AS `total_times` #ifnull(sum(`t3`.`TotalTimes`), 0) AS `total_times` from ((`t_standard_data_task_backup` `t1` join `t_dpp_cp_registry` `t2` ON ((`t1`.`contentprovider_id` = `t2`.`cp_id`))) left join `t_infoaccess_total_summery` `t3` ON ((`t1`.`info_id` = `t3`.`InfoID`))) ) AS cpinfo group by cp_id , datatype_name;
之前在执行时还报了一个错误:
Every derived table must have its own alias
百度了一下后找到了答案:
这句话的意思是说每个派生出来的表都必须有一个自己的别名
一般在多表查询时,会出现此错误。
因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名
把MySQL语句改成:select count(*) from (select * from ……) as total;
问题就解决了,虽然只加了一个没有任何作用的别名total,但这个别名是必须的
加上了AS cpinfo后就没问题了。