Reputation: 749
I'm looking for a single MySQL query (subqueries are fine) that will get a distribution of units per order over the past year in the following format:
units_per_order | number_of_orders | percent_of_total --------------------------------------------------------------------- 1 | 7500 | 55% 2 3 4 5 6-10 10-20 30-50 50–100 100+
EDIT:
Tables and necessary columns to query against:
Table: orders Fields: orders_id, date_purchased Table: orders_products Fields: orders_id, products_quantity
This is what I have right now:
SELECT COUNT(*) AS cnt, qty FROM ( SELECT SUM(products_quantity) as qty, orders_id FROM orders_products op LEFT JOIN orders o USING (orders_id) WHERE date_purchased LIKE '2012%' GROUP BY orders_id ) AS new_table WHERE qty != 0 GROUP BY qty ORDER BY qty
Any ideas?
Upvotes: 1
Views: 154
Reputation: 749
Ok, here's what I ended up with. Please advise if you see any way to make it more efficient.
SELECT qty, cnt, ROUND(((cnt / total) * 100)) AS percent FROM (
SELECT qty, COUNT(*) AS cnt, total
FROM (
SELECT
(
CASE WHEN (SUM(products_quantity) < 6) THEN SUM(products_quantity)
WHEN (SUM(products_quantity) BETWEEN 6 AND 10) THEN 6
WHEN (SUM(products_quantity) BETWEEN 11 AND 20) THEN 11
WHEN (SUM(products_quantity) BETWEEN 21 AND 50) THEN 21
WHEN (SUM(products_quantity) BETWEEN 51 AND 100) THEN 51
ELSE 101
END
) AS qty,
orders_id,
(
SELECT COUNT(DISTINCT(orders_id))
FROM orders JOIN orders_products USING (orders_id)
WHERE date_purchased LIKE '2012%' AND products_quantity != 0
) AS total
FROM orders_products op JOIN orders o USING (orders_id)
WHERE date_purchased LIKE '2012%'
GROUP BY orders_id
) AS new_table
WHERE qty != 0 GROUP BY qty
) AS newer_table
Upvotes: 0