【问题标题】:How to apply filter using a joined table如何使用连接表应用过滤器
【发布时间】:2020-12-03 17:18:26
【问题描述】:

我正在尝试使用 accounts 表对我的查询 (accounts.provider = 'z') 应用过滤器。我目前的查询没有正确应用过滤器,正在添加完整的付款列表,无论提供者条件如何。我之所以使用表 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

感谢您的帮助

根据 cmets 中的建议更新了查询,但没有产生正确的结果(请参阅 cmets)。

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

【问题讨论】:

  • 是mysql还是PostgreSQL? ,,请删除错误的标签...
  • 删除了不一致的数据库标签,请仅添加特定的数据库标签。
  • 抱歉,这是postgresql

标签: sql postgresql join


【解决方案1】:

您在应用accounts.provider = 'z' 条件之前计算pending_payments(在子查询中)。

你应该替换这段代码:

....
....
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 
....
....

【讨论】:

  • 您好,谢谢。知道为什么查询一直在旋转并且不返回结果吗?我已在问题文本中发布了更新后的查询
  • 在子查询中也应用 date where 子句。
  • 谢谢,使用子查询中的日期 where 子句再次更新查询。但是,我返回的数字恰好是实际数字的倍数(乘以 13、20 等)——不同的日期是不同的倍数。介意看看吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2021-06-18
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多