近日,拾起了许久有些手生的SQL,又要开始做复杂的报表统计查询了。由于匹配统计的指标时,是根据顺序号匹配对应明细数据的,并没有采用明细数据id匹配,这样可以解决指标配置修改后id对应不上的问题。这样就带来了一个新的问题,查询基础统计数据时,就要标识出来顺序号。
简单来说,就是要知道这条明细数据是在同类项目中第几条。以下图为例,假设当前统计数据的某一条记录的明细数据id是5032,那么要根据5032查询同类数据,并计算出5032在同类数据中的第几条。那么5032对应的顺序号就是1。
查询行号,第一个想到的就是rownum,oracle可以很方便的使用,但是在mysql中就没有这种官方提供的函数。经查询,可以使用@rownum自定义序号。
SELECT *, @rownum := @rownum + 1 AS rownum FROM quality_check_param_level,( SELECT @rownum := 0 ) r
由于统计查询较为复杂,顺序号字段需要写在子查询中,而需要使用这种方式,那么id字段和rownum字段需要暴露出来,在where条件中判断id匹配,然后取rownum字段作为顺序号。要这样写就要再包裹一层查询,然而这样就会导致一个错误,在最内层子查询中获取不到外层的条件,子查询是从最内层开始执行的。
此路不通,其实可以另辟蹊径,只是有些条件限制。那就是这个子表中至少有一个可以确定的排序顺序,就本次业务场景而言,完全可以采用id的大小顺序,默认是从小到大的顺序查询。只需要关联查询子表,添加固定关联条件外加限制字段比如 id<=5032, 再统计查询数据的数量再减一就可以得到从0开始的顺序号。
如以下sql的itemDetailNo字段。
SELECT p.id as planId, p.plan_name as planName, 'hospital' as planType, d.template_id as templateId, d.template_uuid as templateUUID, t.template_name as templateName, i.id as implementId, i.dept_id as deptId, i.dept_name as deptName, c.id as implementCopiesId, c.implement_quantity_no as implementQuantityNo, d.item_id as itemId, d.item_uuid as itemUUID, d.item_name as itemName, (select count(1) - 1 from quality_check_template_detail de where de.template_id = d.template_id and de.template_uuid = d.template_uuid and de.item_uuid = d.item_uuid and de.id <= d.id) as itemDetailNo, e.id as evalId, e.eval_desc as evalDesc, d.id as templateDetailId, d.check_content as checkContent, e.param_level_id as paramLevelId, l.level_name as paramLevelName, l.color as paramLevelColor, QUARTER(p.plan_start_date) as quarter, e.actual_check_user_name as actualCheckUserName, e.actual_check_time as actualCheckTime, f.statistic_formula_property as statisticFormulaProperty, IFNULL(f.join_statistics,'0') as joinStatistics FROM quality_check_implement_eval e left join quality_check_param_level l on e.param_level_id =l.id left join quality_check_implement_copies c on e.implement_copies_id = c.id left join quality_check_implement i on e.implement_id = i.id left join quality_check_template_detail d on e.template_detail_id = d.id left join quality_check_template t on d.template_id = t.id left join quality_check_indicators_statistics_formula f on e.param_level_id = f.param_level_id left join quality_check_plan p on e.plan_id = p.id order by p.id desc,d.template_uuid asc,d.template_id asc,d.item_uuid asc,d.item_id asc,d.id asc,e.id asc
还没有评论,来说两句吧...