Utifrån din fråga gissar det att det också finns order_id
fältet i din order_products
tabell som du inte nämnde i tabelldefinitionen. Din fråga bör då se ut så här:
SELECT c.name AS category_name,
SUM( s.subtotal ) AS amt,
GROUP_CONCAT( CONCAT(s.name, ' - ', s.subtotal ) SEPARATOR ', ' ) AS subtotals
FROM
product_category c
JOIN
( SELECT op.category, op.name, sum(op.qty*op.unit_price) AS subtotal
FROM order_products op
JOIN orders o ON o.id = op.order_id
WHERE o.date > '2012-03-31'
GROUP BY op.category, op.name ) s
ON s.category = c.id
GROUP BY c.name
Ditt db-schema är dock ganska konstigt, ordertabellen ser ut att kunna tas bort och det datumet flyttas till order_products, eftersom du för varje order_products-rad har referens till ordertabellen. Vanligtvis är det åt andra hållet - det finns många beställningar för varje produkt som refereras av produkt_id-fältet i beställningstabellen. Även datumkolumnen i beställningar är av typen varchar - varför inte datum eller datumtid?