У меня есть таблица («дамп») с транзакциями, и я хочу перечислить общую сумму, сгруппированную по категориям, за месяц, например: Месяц | Категория | ID категории | SUM. Соответствующие таблицы выглядят так:
TABLE dump:
id INT
date DATE
event VARCHAR(100)
amount DECIMAL(10, 2)
TABLE dump_cat:
id INT
did INT (id in dump)
cid INT (id in categories)
TABLE categories:
id INT
name VARCHAR(100)
Теперь я пытаюсь использовать следующий запрос:
SELECT SUBSTR(d.date,1,7) AS month, c.name, c.id AS catid, SUM(d.amount) AS sum
FROM dump as d, dump_cat as dc, categories AS c
WHERE dc.did = d.id AND c.id = dc.cid AND SUBSTR(d.date, 1, 7) >= '2008-08'
GROUP BY month, c.name ORDER BY month;
Но сумма для большинства категорий в два раза больше, чем должна быть. Я предполагаю, что это потому, что соединение возвращает несколько строк, но добавление «DISTINCT d.id» в части поля не имеет никакого значения. Пример того, что возвращает запрос:
+---------+--------------------------+-------+-----------+
| month | name | catid | sum |
+---------+--------------------------+-------+-----------+
| 2008-08 | Cash | 21 | -6200.00 |
| 2008-08 | Gas | 8 | -2936.19 |
| 2008-08 | Rent | 1 | -15682.00 |
где как
SELECT DISTINCT d.id, d.amount FROM dump AS d, dump_cat AS dc
WHERE d.id = dc.did AND SUBSTR(d.date, 1, 7) ='2008-08' AND dc.cid = 21;
возвращает
+------+----------+
| id | amount |
+------+----------+
| 3961 | -600.00 |
| 2976 | -200.00 |
| 2967 | -400.00 |
| 2964 | -200.00 |
| 2957 | -300.00 |
| 2962 | -1400.00 |
+------+----------+
Это составляет 3100, что составляет половину суммы, указанной выше. Если я удаляю «DISTINCT d.id» из последнего запроса, каждая строка указывается дважды. Это, я думаю, проблема, но мне нужна помощь, чтобы понять, как ее решить. Заранее спасибо.
Добавлено: если я соберу таблицы dump и dump_cat в одну, с
CREATE table dumpwithcat SELECT DISTINCT d.id, d.date, d.event, d.amount, dc.cid
FROM dump AS d, dump_cat AS c WHERE c.did = d.id;
и выполните запрос к этой таблице, все работает нормально с правильной суммой. Есть ли способ сделать это в исходном запросе, с помощью подзапроса или что-то в этом роде?