Я переписал с использованием более нового стиля ANSI, чем более старый формат списка таблиц, и явно добавил критерии объединения в предложении WHERE. Таким образом, вы должны лучше видеть взаимосвязь каждой таблицы с другими и явные ограничения (например, критерии даты), которые вы хотите применить к этим элементам JOINED. В предложении where остаются только критерии для первой таблицы выбора.
Я применил ДВА соединения к таблице категорий, однажды основываясь на вашем намерении найти категорию PARENT и имя и ссылочный идентификатор (при условии, что существует родительский идентификатор). Если нет, он будет искать найденный идентификатор категории по умолчанию.
Единственный сбой, который я думаю, я вижу, это объединение с ожидаемыми расходами, где ваши критерии только для group_ID = 1, а ваши критерии для категорий бюджета - либо 1, либо 139 (через в пункте). Если они фактически ПРЕДЛАГАЕТСЯ быть одинаковыми, то измените объединение на
"И bc.group_ID = bee.group_ID"
Наконец, подтвердите, что вы хотите сгруппировать по ... исходной категории или родителю, с которым она связана, но это тоже ваш вызов.
SELECT
bc.name,
bc.category_id,
bc.ref_id,
COALESCE( bc.parent_id,bc.category_id) as Which_Category_id,
COALESCE( bcParent.Name, bcDefCat.Name ) as Category_Name,
COALESCE( bcParent.Ref_ID, bcDefCat.Ref_ID ) as Category_Ref_ID,
COALESCE(sum(bee.amount),0) as amount
FROM
budget_categories bc
LEFT JOIN budget_expected_expenses bee
ON bc.category_id = bee.cat_id
AND bee.group_ID = 1
AND bee.date BETWEEN '2012-01-01' AND '2012-01-31'
LEFT JOIN budget_categories bcParent
on bc.parent_ID = bcParent.category_ID
JOIN budget_categories bcDefCat
on bc.Category_ID = bcDefCat.category_ID
WHERE
bc.group_id IN (1,139)
GROUP BY
bc.category_id
ORDER BY
bc.ref_id ASC