У меня есть таблица («дамп») с транзакциями, и я хочу перечислить общую сумму, сгруппированную по категориям, в месяц, например: Месяц | Категория | Идентификатор категории | SUM. Таблицы, участвующие выглядит следующим образом:Получение SUM() в разных строках в mysql
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_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;
и сделать запрос на этой таблице, все в порядке с правильной суммой работ. Есть ли способ сделать это в исходном запросе, с подзапросом или что-то в этом роде?
Если вы выберете SUM и GROUP BY и просто выберите суммы, вы видите дубликаты записей? –
Эрик: Да. Как я могу избавиться от них? :) – Par
Если вы присоединяетесь к дампу и dump_cat, вы получаете дубликаты? Как насчет dump_cat и категорий? –