Предполагам, че от вашата заявка има и order_id
поле във вашите order_products
таблица, която не сте споменали в дефиницията на таблицата. Вашата заявка трябва да изглежда така:
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
Вашата db схема обаче е доста странна, таблицата с поръчки изглежда, че може да бъде премахната и тази дата да бъде преместена в order_products, защото за всеки ред order_products имате препратка към таблицата с поръчки. Обикновено е обратното - има много поръчки за всеки продукт, посочен в полето product_id в таблицата с поръчки. Също така колоната за дата в поръчките е от тип varchar - защо не дата или дата и час?