Zgadując z zapytania, istnieje również order_id
pole w Twoim order_products
tabela, której nie wymieniłeś w definicji tabeli. Twoje zapytanie powinno wtedy wyglądać tak:
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
Twój schemat bazy danych jest jednak dość dziwny, tabela zamówień wygląda na to, że mogłaby zostać usunięta i ta data została przeniesiona do order_products, ponieważ dla każdego wiersza order_products masz odniesienie do tabeli orders. Zwykle jest odwrotnie - istnieje wiele zamówień na każdy produkt, do którego odwołuje się pole product_id w tabeli zamówień. Również kolumna daty w zamówieniach jest typu varchar - dlaczego nie data lub data i godzina?