Как применить фильтр с использованием объединенной таблицы

#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 и т.д.) — разные даты — это разные кратные. Не могли бы вы взглянуть, пожалуйста?