Задавайте вопросы, мы ответим
Вы не зашли.
Нужна небольшая помощь: есть задача и я писал решение к ней :
Платежи клиентов в базе данных хранятся в трех таблицах:
1. bank_transactions — прямые платежи на расчетный счет,
2. cashbox_transactions — платежи наличными в кассу организации,
3. paypal_transactions — платежи через сервис PayPal.
Получите суммы входящих платежей по всем таблицам с разбивкой по годам и месяцам. Итоговая таблица должна содержать 3 столбца: year, month, month_amount. Итоговые данные отсортируйте по году и месяцу.
bank_transactions
id client_id date amount
1 12 2017-02-01 11:35:17 560.00
2 56 2017-03-03 15:43:18 3000.00
3 124 2017-04-14 12:12:02 1400.50
cashbox_transactions
id client_id date amount
1 56 2017-02-04 10:12:09 74.00
2 451 2017-04-10 22:12:04 871.00
3 98 2018-02-16 09:00:30 1000.00
paypal_transactions
id client_id date amount
1 8471 2017-02-28 14:12:18 1490.00
2 5155 2017-04-09 14:14:00 2400.50
3 56 2018-01-17 08:45:30 4050.24
Решение:
SELECT
YEAR(date) as year,
MONTH(date) as month,
month_amount
FROM
(SELECT
date,
SUM(month_amount) as month_amount
FROM
(SELECT
DATE_FORMAT(date, '%Y %c') as date,
SUM(amount) as month_amount
FROM
bank_transactions
GROUP BY date
UNION
SELECT
DATE_FORMAT(date, '%Y %c') as date,
SUM(amount) as month_amount
FROM
cashbox_transactions
GROUP BY date
UNION
SELECT
DATE_FORMAT(date, '%Y %c') as date,
SUM(amount) as month_amount
FROM
paypal_transactions
GROUP BY date
)
entiries
GROUP BY date
)
entiries
ORDER BY year, month
Запрос вернул:
Wrong records selected
Query result:
+------+-------+--------------+
| year | month | month_amount |
+------+-------+--------------+
| None | None | 3000.00 |
| None | None | 4672.00 |
| None | None | 4050.24 |
| None | None | 1000.00 |
| None | None | 2124.00 |
+------+-------+--------------+
Affected rows: 5
Не могу понять где закралась ошибка.
До этого пробовал вместо YEAR, MONTH ставить
SUBSTRING_INDEX(date,' ',1) as year,
SUBSTRING_INDEX(date,' ',-1) as month,
Результат:
Wrong records selected
Query result:
+------+-------+--------------+
| year | month | month_amount |
+------+-------+--------------+
| 2017 | 2 | 2124.00 |
| 2017 | 3 | 3000.00 |
| 2017 | 4 | 4672.00 |
| 2018 | 1 | 4050.24 |
| 2018 | 2 | 1000.00 |
+------+-------+--------------+
Affected rows: 5
На вопрос преподавателю он ответил что запрос верный, но из-за особенностей механизма тестирования он не пройдет. Вы получаете год и месяц в виде строк (SUBSTRING_INDEX возвращает строки), а тест сравнивает с числами. Тут можно заменить SUBSTRING_INDEX на YEAR и MONTH, чтобы извлекать сразу числа. Однако заменив(как видно выше) результат не дал успехов.
Неактивен
попробуйте явно преобразовать к нужному типу через cast
https://dev.mysql.com/doc/refman/8.0/en … ction_cast
Неактивен
Lugner32 написал:
Тут можно заменить SUBSTRING_INDEX на YEAR и MONTH, чтобы извлекать сразу числа. Однако заменив(как видно выше) результат не дал успехов.
ну так и результат у вас там объективно неверный - None вместо числа, потому что date на тот момент применения к нему ф-ий YEAR и MONTH содержит не дату, а строку вида: 4 цифры пробел 2 цифры. (переопределяя имя поля, давайте новое название, чтобы не путаться)
логичней применять union all
группировку можно сделать 1 раз
group by YEAR(`date`), MONTH(`date`) -- где `date` исходная дата
Неактивен
Я конечно дико извиняюсь но я не совсем понял что конкретно надо обновить\изменить :-)
Неактивен
Неактивен
vasya написал:
select YEAR(`date`), MONTH(`date`), sum(amount) as month_amount from
(select `date`, amount from bank_transactions
union all
..
select `date`, amount from paypal_transactions) t
group by YEAR(`date`), MONTH(`date`)
ORDER BY YEAR(`date`), MONTH(`date`);
select YEAR(`date`)as year, MONTH(`date`) as month, sum(amount) as month_amount from
(select `date`, amount from bank_transactions
union all
select `date`, amount from
cashbox_transactions
union all
select `date`, amount from paypal_transactions) t
group by YEAR(`date`), MONTH(`date`)
ORDER BY YEAR(`date`), MONTH(`date`);
Вот сделал так, ибо без указания as year, as month выдавал ошибку о не правильном названии столбцов :-)
Ещё раз спасибо за помощь... :-)
Неактивен