Sumif с условием даты из другой таблицы - PullRequest
0 голосов
/ 30 мая 2018

Я хотел бы знать, есть ли в SQL функция, позволяющая рассчитать сумму на основе условия даты.Проблема, с которой я сталкиваюсь, заключается в том, что дату нужно выбрать из другой таблицы.

Вот мой код (этот работает нормально):

SELECT p.first_name, p.last_name, p.customer_id, SUM(p.amount)
FROM payment p, customer c
WHERE c.customer_id = p.customer_id
GROUP BY 1
ORDER BY 4 DESC

Таблица содержит следующие данные:

Payment Table 

Payment ID  Customer_ID First_Name Last_Name  Amount Payment Date
1            1           ABC        1          $10    2018-01-01
2            1           ABC        1          $20    2018-02-01
3            1           ABC        1          $30    2018-03-01
4            2           ABC        2          $40    2018-04-01
5            2           ABC        2          $50    2018-05-01
6            3           ABC        3          $60    2018-06-01
7            3           ABC        3          $70    2018-07-01

Customer Table

Customer_ID    Call Date
1              2018-02-01
2              2018-05-01
3              2018-07-01

Моя задача состоит в том, чтобы запросработать так, чтобы он выбирал дату (Call Date) из таблицы клиентов и суммировал значения платежей, выполненных до даты вызова.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Во-первых, не используйте номера столбцов в GROUP BY и ORDER BY.Используйте имена или псевдонимы столбцов.

Во-вторых, используйте явные объединения.

В-третьих, перечислите в GROUP BY все столбцы, которые отображаются в SELECT и не имеют функции агрегирования.Хотя MySQL этого не требует, это требуется стандартами SQL и большинством других баз данных.И это необходимо по причине.MySQL наконец-то решил проблему, и , начиная с MySQL 5.7.5, режим SQL ONLY_FULL_GROUP_BY включен по умолчанию .

Теперь это не так, вы можете использовать добавить условие даты вусловие соединения:

SELECT c.first_name, c.last_name, p.customer_id, SUM(p.amount) AS total
FROM payment p
INNER JOIN customer c ON c.customer_id = p.customer_id
                     AND p.payment_date < c.call_date
GROUP BY p.customer_id, c.first_name, c.last_name
ORDER BY total DESC
0 голосов
/ 30 мая 2018

Вы можете попробовать этот запрос:

SELECT
    first_name, 
    last_name,
    call_date,
    customer_id, 
    SUM(
        CASE WHEN payment_date < call_date
        THEN amount
        ELSE 0
        END
    )
FROM
(
    Select 
        c.first_name, 
        c.last_name,
        c.call_date,
        p.customer_id, 
        p.amount
        p.payment_date
    From
        payment p JOIN customer c
            ON c.customer_id = p.customer_id
) a

GROUP BY 1,2,3,4

Надеюсь, это поможет, удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...