Podle vašeho dotazu existuje také order_id
pole ve vašem order_products
tabulka, kterou jste nezmínili v definici tabulky. Váš dotaz by pak měl vypadat takto:
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
Vaše schéma databáze je však docela divné, tabulka objednávek vypadá, že by mohla být odstraněna a toto datum přesunuto do order_products, protože pro každý řádek order_products máte odkaz na tabulku orders. Obvykle je to naopak - existuje mnoho objednávek pro každý produkt, na který odkazuje pole product_id v tabulce objednávek. Také sloupec data v objednávkách je typu varchar - proč ne datum nebo datum a čas?