SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.04.2019 11:45:20

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Помогите исправить ошибку

Нужна небольшая помощь: есть задача и я писал решение к ней :

Платежи клиентов в базе данных хранятся в трех таблицах:
    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, чтобы извлекать сразу числа. Однако заменив(как видно выше) результат не дал успехов.

Неактивен

 

#2 05.04.2019 12:46:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите исправить ошибку

попробуйте явно преобразовать к нужному типу через cast
https://dev.mysql.com/doc/refman/8.0/en … ction_cast

Неактивен

 

#3 05.04.2019 13:00:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите исправить ошибку

Lugner32 написал:

Тут можно заменить SUBSTRING_INDEX на YEAR и MONTH, чтобы извлекать сразу числа. Однако заменив(как видно выше) результат не дал успехов.

ну так и результат у вас там объективно неверный - None вместо числа, потому что date на тот момент применения к нему ф-ий YEAR и MONTH содержит не дату, а строку вида: 4 цифры пробел 2 цифры. (переопределяя имя поля, давайте новое название, чтобы не путаться)

логичней применять union all

группировку можно сделать 1 раз
group by YEAR(`date`), MONTH(`date`) -- где `date` исходная дата

Неактивен

 

#4 05.04.2019 15:03:43

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Re: Помогите исправить ошибку

Я конечно дико извиняюсь но я не совсем понял что конкретно надо обновить\изменить :-)

Неактивен

 

#5 05.04.2019 15:55:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите исправить ошибку

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`);

Неактивен

 

#6 05.04.2019 16:15:01

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Re: Помогите исправить ошибку

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 выдавал ошибку о не правильном названии столбцов :-)

Ещё раз спасибо за помощь... :-)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson