In een stukje software dat wordt gebruikt in een magazijn wordt per pakbon bijgehouden hoe lang een persoon erover doet om deze bij elkaar te pakken. Dit wordt gebruikt om van alle pakbonnen die nog open staan een indicatie te geven hoe lang het duurt om die te pakken.
Om tot die indicatie te komen kijk ik nu naar de afgelopen 14 dagen en neem de gemiddelde tijd die het duurt om een pakbon te pakken gedeeld door het aantal items op een pakbon. Dat gemiddelde vermenigvuldig ik vervolgens met het totaal openstaande items. Afijn, dat was een goed begin en geeft al een goed beeld voor de medewerkers in het magazijn.
Nu wil ik de indicatie wat verfijnen door meer te kijken naar de afstand die ze moeten lopen. Een pakbon met 2 items die naast elkaar liggen is natuurlijk veel sneller gepakt dan een pakbon met 2 items waarvoor ze 5 minuten moeten lopen.
Ik heb 3 tabellen, ik weet van elk item dat gepakt moet worden waar het ligt en hoe ver deze uit elkaar liggen. De kolom stockplace.rang is zo opgebouwd dat deze een goede weerspiegeling is van de afstanden tussen de verschillende voorraadplaatsen. Dus die kan ik gebruiken.
Dit is de query die ik nu heb om er wat mee te spelen:
Ik heb nu de totale en gemiddelde loop-afstand van een pakbon waar ik wat mee kan rekenen, maar wat ik eigenlijk wil is de gemiddelde stapgrootte weten. Zodat als product A, B, C en D allemaal naast elkaar liggen en alleen product E helemaal aan de andere kant van het magazijn ligt dat de tijdsindicatie lager is dan als A, B, C, D en E allemaal verspreid liggen door het magazijn.
Hoe bereken ik in een query de stapgrootte tussen verschillende clientpackageitem_id en gooi ik daar AVG() overheen?
Om tot die indicatie te komen kijk ik nu naar de afgelopen 14 dagen en neem de gemiddelde tijd die het duurt om een pakbon te pakken gedeeld door het aantal items op een pakbon. Dat gemiddelde vermenigvuldig ik vervolgens met het totaal openstaande items. Afijn, dat was een goed begin en geeft al een goed beeld voor de medewerkers in het magazijn.
Nu wil ik de indicatie wat verfijnen door meer te kijken naar de afstand die ze moeten lopen. Een pakbon met 2 items die naast elkaar liggen is natuurlijk veel sneller gepakt dan een pakbon met 2 items waarvoor ze 5 minuten moeten lopen.
Ik heb 3 tabellen, ik weet van elk item dat gepakt moet worden waar het ligt en hoe ver deze uit elkaar liggen. De kolom stockplace.rang is zo opgebouwd dat deze een goede weerspiegeling is van de afstanden tussen de verschillende voorraadplaatsen. Dus die kan ik gebruiken.
SQL:
1
2
3
4
5
6
| CREATE TABLE `clientpackage` ( `clientpackage_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `account_id` SMALLINT(5) UNSIGNED NOT NULL, `created` TIMESTAMP NOT NULL, PRIMARY KEY (`clientpackage_id`) ); |
SQL:
1
2
3
4
5
6
7
8
9
| CREATE TABLE `clientpackageitem` ( `clientpackageitem_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `clientpackage_id` INT(10) UNSIGNED NOT NULL, `clientorderitem_id` INT(10) UNSIGNED NOT NULL, `stockplace_id' INT(10) UNSIGNED NOT NULL, `packed` DATETIME NULL DEFAULT NULL, `packed_by` INT(10) UNSIGNED NULL DEFAULT NULL, PRIMARY KEY (`clientpackageitem_id`) ); |
SQL:
1
2
3
4
5
6
7
8
| CREATE TABLE `stockplace` ( `stockplace_id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT, `stockplacetype_id` INT(11) NOT NULL, `stockplace` VARCHAR(45) NOT NULL, `description` VARCHAR(512) NULL DEFAULT NULL, `rang` INT(12) NULL DEFAULT NULL, PRIMARY KEY (`stockplace_id`) ); |
Dit is de query die ik nu heb om er wat mee te spelen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
| SELECT cp.clientpackage_id, COUNT(*) AS 'items', (MAX(cpi.packed)-MIN(cpi.packed)) AS 'total_time', (MAX(sp.rang)-MIN(sp.rang)) AS 'total_length', ((MAX(cpi.packed)-MIN(cpi.packed)) / COUNT(*)) AS 'avg_time', ((MAX(sp.rang)-MIN(sp.rang)) / COUNT(*)) AS 'avg_length' FROM clientpackage cp INNER JOIN clientpackageitem cpi ON cpi.clientpackage_id = cp.clientpackage_id INNER JOIN stockplace sp ON sp.stockplace_id = cpi.stockplace_id WHERE cp.created > DATE_SUB(NOW(), INTERVAL 14 DAY) GROUP BY cp.clientpackage_id ORDER BY cp.clientpackage_id DESC |
Ik heb nu de totale en gemiddelde loop-afstand van een pakbon waar ik wat mee kan rekenen, maar wat ik eigenlijk wil is de gemiddelde stapgrootte weten. Zodat als product A, B, C en D allemaal naast elkaar liggen en alleen product E helemaal aan de andere kant van het magazijn ligt dat de tijdsindicatie lager is dan als A, B, C, D en E allemaal verspreid liggen door het magazijn.
Hoe bereken ik in een query de stapgrootte tussen verschillende clientpackageitem_id en gooi ik daar AVG() overheen?