#sql #postgresql #join
#sql #postgresql #Присоединиться
Вопрос:
Я пытаюсь применить фильтр к своему запросу (accounts.provider = ‘z’), используя таблицу accounts . Запрос, который у меня есть на данный момент, неправильно применяет фильтр, полный список платежей суммируется, независимо от условия поставщика. Причина, по которой я использую таблицу x для объединения с таблицей accounts, заключается в том, что в таблице t отсутствует столбец account_id, позволяющий мне объединить его с таблицей accounts.
Это мой текущий запрос
SELECT
distinct on (x.day) x.day,
coalesce(pending_payments,0)
from
(( SELECT day::date
FROM generate_series(timestamp '2017-03-13', current_date interval '1 week', interval '1 day') day
) d
left JOIN (
SELECT date_trunc('day', payment_date)::date AS day,
sum(case when payment_amount > 0
and description not ilike '%credit%'
and state = 'pending'
then payment_amount end) as pending_payments
FROM payments
GROUP BY 1
) t USING (day) inner join payments on payments.payment_date = t.day) x
inner join accounts on accounts.id = x.account_id and accounts.provider = 'z'
where day <= current_date interval '1 week'
and day >= current_date - interval'6 months'
ORDER BY x.day desc
Спасибо за вашу помощь
Обновленный запрос на основе предложений в комментариях, но он не дает правильного результата (см. Комментарии).
SELECT
distinct on (t.day) t.day as day,
coalesce(pending_payments,0)
from
( SELECT day::date
FROM generate_series(timestamp '2017-03-13', current_date interval '1 week', interval '1 day') day
) d
left JOIN (
SELECT date_trunc('day', t.payment_date)::date AS day,
sum(case when t.payment_amount > 0
and t.description not ilike '%credit%'
and t.state = 'success'
then t.payment_amount end) as pending_payments
FROM payments t
inner join payments p on p.payment_date = date_trunc('day', t.payment_date)::date
inner join accounts on accounts.id = p.account_id and accounts.provider = 'z'
where date_trunc('day', t.payment_date)::date <= current_date interval '1 week'
and date_trunc('day', t.payment_date)::date >= current_date - interval'1 months'
GROUP BY 1
) t USING (day)
ORDER BY day desc
Комментарии:
1. это mysql или PostgreSQL? ,, пожалуйста, удалите неправильный тег…
2. Удалены несовместимые теги базы данных, пожалуйста, добавьте только определенный тег базы данных.
3. Извиняюсь, это postgresql
Ответ №1:
Вы вычисляете pending_payments
(в подзапросе) перед применением accounts.provider = 'z'
условия.
Вы должны заменить этот код:
....
....
left JOIN (
SELECT date_trunc('day', payment_date)::date AS day,
sum(case when payment_amount > 0
and description not ilike '%credit%'
and state = 'pending'
then payment_amount end) as pending_payments
FROM payments
GROUP BY 1
) t USING (day) inner join payments on payments.payment_date = t.day) x
inner join accounts on accounts.id = x.account_id and accounts.provider = 'z'
....
....
с
....
....
left JOIN (
SELECT date_trunc('day', t.payment_date)::date AS day,
sum(case when t.payment_amount > 0
and t.description not ilike '%credit%'
and t.state = 'pending'
then t.payment_amount end) as pending_payments
FROM payments t
inner join payments p on p.payment_date = date_trunc('day', t.payment_date)::date
inner join accounts on accounts.id = p.account_id and accounts.provider = 'z'
GROUP BY 1
) t
....
....
Комментарии:
1. привет, спасибо за это. есть идеи, почему запрос просто продолжает вращаться и не возвращает мне результат? Я опубликовал обновленный запрос в тексте вопроса
2. Также примените предложение date where в подзапросе.
3. спасибо, снова обновил запрос с предложением date where в подзапросе. Однако возвращаемые мне числа в точности кратны реальным цифрам (умноженным на 13, 20 и т.д.) — разные даты — это разные кратные. Не могли бы вы взглянуть, пожалуйста?