sql - MySQL query sum and group suggestion needed -
i'm trying while query running, more difficult thought. have following 3 tables:
stores: +--+-------+--------------+-------+---------+---------+----+---------------+---+------+ |id|company|address |postcod|latitude |longitude|stat| division |gro| when | +--+-------+--------------+-------+---------+---------+----+---------------+---+------+ |17|company|site address 3|wf1 5nt|53.666340|-1.487857|open|test division 2|arl|2014-01-31 14:36:04 |18|company|site address 3|wf1 5nt|53.666340|-1.487857|open|test division 2|arl|2014-01-31 14:36:04 |19|company|site address 3|wf1 5nt|53.666340|-1.487857|open|test division 2|arl|2014-01-31 14:36:04 |20|company|site address 3|wf1 5nt|53.666340|-1.487857|open|test division 2|arl|2014-01-31 14:36:04 +--+-------+--------------+-------+---------+---------+----+---------------+---+------+ jobs: +--------+-------------------------------------------+-------+------------+------+--------+ | client | description | freq | | till |job_id | +--------+-------------------------------------------+-------+------------+------+--------+ | 17 | weekly external , internal window clean | 7 | 2013-10-01 | null | 17 | | 18 | weekly external , internal window clean | 7 | 2013-10-01 | null | 18 | | 19 | weekly external , internal window clean | 7 | 2013-10-01 | null | 19 | | 20 | weekly external , internal window clean | 7 | 2013-10-01 | null | 20 | | 17 | 4 weekly fascia , upper floor windows | 28 | 2013-10-01 | null | 645 | | 18 | 4 weekly fascia , upper floor windows | 28 | 2013-10-01 | null | 646 | | 19 | 4 weekly fascia , upper floor windows | 28 | 2013-10-01 | null | 647 | | 20 | 4 weekly fascia , upper floor windows | 28 | 2013-10-01 | null | 648 | +--------+-------------------------------------------+-------+------------+------+--------+ job_hist +------+-------------------+-----------------+---------+------+--------------+-----------------------------------------+-------------------------------+------+-----+-----------------------+------+ |job_id| last | user | company | link | signedy_by | job description | address | accu |days | possition |uniqid| +------+-------------------+-----------------+---------+------+--------------+-----------------------------------------+-------------------------------+------+-----+-----------------------+------+ |17 |2013-10-01 09:35:37|arl_operative_013|santander| link |tony moore |weekly external window clean | welling 14 br (da16 3pp) |739.00|10 |branch manager |132 | |20 |2013-10-02 12:27:51|arl_operative_013|santander| link |alex goodman |weekly external window clean | harold hill 69 fr (rm3 8xa)|55.00 |6 |store assistant manager|268 | |19 |2013-10-03 09:14:19|arl_operative_013|santander| link |darren pickett|weekly external window clean | woolwich 41 ps (se18 6jd) |50.00 |5 |other |332 | |18 |2013-10-03 09:54:49|arl_operative_013|santander| link |james lawrence|weekly external window clean | eltham 73 ehs (se9 1uw) |49.00 |7 |other |346 | |17 |2013-10-08 09:05:16|arl_operative_013|santander| link |tony moore |weekly external , internal window clean| welling 14 br (da16 3pp) |67.00 |6 |branch manager |697 | +------+-------------------+-----------------+---------+------+--------------+-----------------------------------------+-------------------------------+------+-----+-----------------------+------+
and need write query performance calculation based on divisions. goal to: 1) calculate how many cleans scheduled in given time frame, (simple version) take start date , end date, calculate numbers of day , divide stores
.freq
2) how many of scheduled cleans done on time in period. take data job_hist (where job_hist.jod_id=jobs.job_id , job_hist.last falls in interval , job_hist.days <= freq
3) percentage of cleans done on time
4) how many cleans done late (same logic in point 2 job_hist> freq)
5) percentage of cleans done late
6) how many missed (scheduled - done on time - done late)
7) percentage of missed
all should grouped division, result should this:
+------------------------------+---------+------+-----------------+---------+--------------------+------+-----------------+ |division |scheduled|ontime|ontime_percentage|completed|completed_percentage|missed|missed_percentage +------------------------------+---------+------+-----------------+---------+--------------------+------+-----------------+ |fsdfoihsdfljksdlgjdfsligsgfsfd|16282 |10404 |63.90% |10825 |66.48% |5457 |33.52% |test division 2 |259 |129 |49.81% |133 |51.35% |126 |48.65% |test division 3 |30 |15 |50.00% |15 |50.00% |15 |50.00% +------------------------------+---------+------+-----------------+---------+--------------------+------+-----------------+
now i'm not sql queries, have managed put following query:
select `stores`.`division`, sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) `scheduled`, count(`name`) `ontime`, concat(round(( count(`name`)/sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') ontime_percentage, count(`user`) `completed`, concat(round(( count(`user`)/sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') completed_percentage, (sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`)-count(`user`)) `missed`, concat(round(( (sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`)-count(`user`)) /sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') missed_percentage `stores` left join `jobs` on `stores`.`id`=`jobs`.`client` left join (select `user`,`job_id` `job_hist` `job_hist`.`last`>='$from' , `job_hist`.`last`<='$till') `myquery` on `myquery`.`job_id`=`jobs`.`job_id` left join (select `name`,`job_hist`.`job_id` `job_hist` left join `jobs` on `jobs`.`job_id`=`job_hist`.`job_id` `job_hist`.`last`>='$from' , `job_hist`.`last`<='$till' , `job_hist`.`days`<=`jobs`.`freq`) `myquery2` on `myquery2`.`job_id`=`jobs`.`job_id` `stores`.`owner`='$group' group `division`
the $till, $from, $group php variables, $till , $from dates in string formats , $group string.
now query runs nicely, (there but), scheduled field summing different values, mean doubling value, it's tripling it.
i have read this still wasn't able head around it. more or less understand i'm of results doubled, still cannot figure out need change.
before suggest join on division between stores
.division
, job_hist
.division
not viable, since divisions can change in time, , updated in stores
not in job_hist
.job_hist
should not modified @ time, containing historical data.
thank help.
update
ok after banging head against brick wall 2 hours managed tweak query , till looks i'm getting right data, need run more tests sure before post own answer. anyway here updated query:
select `stores`.`division`, sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) `scheduled`, sum(`ontime`), concat(round(( sum(`ontime`)/sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') ontime_percentage, sum(`completed`-`ontime`), concat(round(( sum(`completed`-`ontime`)/sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') completed_percentage, (sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`)-sum(`completed`)) `missed`, concat(round(( (sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`)-sum(`completed`)) /sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') missed_percentage `stores` left join `jobs` on `stores`.`id`=`jobs`.`client` left join (select count(`user`) `completed`,`job_id` `job_hist` `job_hist`.`last`>='$from' , `job_hist`.`last`<='$till' group `job_id`) `myquery` on `myquery`.`job_id`=`jobs`.`job_id` left join (select count(`name`) `ontime`,`job_hist`.`job_id` `job_hist` left join `jobs` on `jobs`.`job_id`=`job_hist`.`job_id` `job_hist`.`last`>='$from' , `job_hist`.`last`<='$till' , `job_hist`.`days`<=`jobs`.`freq` group `job_id`) `myquery2` on `myquery2`.`job_id`=`jobs`.`job_id` `stores`.`owner`='$group' group `stores`.`division`
if can suggest better way highly appreciate that.
thanks again.
ok.
the problem on grouping here query returns data correctly:
select `stores`.`division`, sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) `scheduled`, sum(`ontime`), concat(round(( sum(`ontime`)/sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') ontime_percentage, sum(`completed`)-sum(`ontime`), concat(round(( (sum(`completed`)-sum(`ontime`))/sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') completed_percentage, (sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`)-sum(`completed`)) `missed`, concat(round(( (sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`)-sum(`completed`)) /sum(datediff(least(ifnull(`till`,curdate()),'$till'),greatest(`from`,'$from')) div `freq`) * 100 ),2),'%') missed_percentage `stores` left join `jobs` on `stores`.`id`=`jobs`.`client` left join (select count(`user`) `completed`,`job_id` `job_hist` `job_hist`.`last`>='$from' , `job_hist`.`last`<='$till' group `job_id`) `myquery` on `myquery`.`job_id`=`jobs`.`job_id` left join (select count(`name`) `ontime`,`job_hist`.`job_id` `job_hist` left join `jobs` on `jobs`.`job_id`=`job_hist`.`job_id` `job_hist`.`last`>='$from' , `job_hist`.`last`<='$till' , `job_hist`.`days`<=`jobs`.`freq` group `job_id`) `myquery2` on `myquery2`.`job_id`=`jobs`.`job_id` `stores`.`owner`='$group' group `stores`.`division`
if has better solution please post it.
thank you.
Comments
Post a Comment