【问题标题】:oracle group by can't get last payment_date, payment_sum [duplicate]oracle group by 无法获得最后的 payment_date,payment_sum [重复]
【发布时间】:2014-01-24 08:29:27
【问题描述】:

我有以下疑问:

SELECT
  p.id,
  last_date_ps.pay_date last_pay_date
FROM projects p
  LEFT JOIN
  (
    SELECT
      pp.project_id,
      max(pp.pay_date) AS pay_date,
      pp.pay_sum
    FROM project_partuals pp
    WHERE pp.status IN (2, 4) AND pp.pay_sum > 0 AND pp.pay_date IS NOT NULL
    GROUP BY pp.project_id
  ) last_date_ps ON last_date_ps.project_id = p.id,
  contacts c
WHERE (p.debtor_contact_id = c.id)
ORDER BY priority_value DESC, name_f ASC;

我得到这个错误:

Error: ORA-00979: not a GROUP BY expression

SQLState:  42000
ErrorCode: 979
Position: 216

当我删除 pp.pay_sum 查询有效。我怎样才能进入左连接(.... pay_date and pay_sum ORDER BY date DESC(Maximum date)

【问题讨论】:

    标签: sql oracle syntax group-by


    【解决方案1】:

    如果您希望每个项目的 pay_sum 作为内部查询的结果,您需要聚合它:

        (select pp.project_id, max(pp.pay_date) as pay_date, sum(pp.pay_sum) as  pay_sum
        from project_partuals pp 
        where pp.status in (2,4) and pp.pay_sum > 0 and pp.pay_date is not null 
        group by pp.project_id ) last_date_ps 
    

    如果您只想要每个项目的最后一次付款,则内部查询应该是:

    (select project_id, pay_date, pay_sum FROM
      (select pp.project_id, pp.pay_date, pp.pay_sum, 
       row_number() over (PARTITION  by pp.project_id order by pp.pay_date desc) rn
       from project_partuals pp  where pp.status in (2,4) and pp.pay_sum > 0 and pp.pay_date is not null 
      ) X where X.rn = 1)
    

    【讨论】:

    • 但是当我通过查询将它添加到组中时,不仅返回最后一次付款(对于每个 project_id),而且返回每个 project_id 的所有付款。我只需要最后一个(按日期 DESC)pay_sum 和 pay_date
    • 感谢您的正确回答!!
    【解决方案2】:

    如果您使用 group by 子句,则必须在查询中包含除常量和聚合函数之外的所有其他选定列,因此在其中包含 pp.pay_sum :

     select 
            p.id,
              last_date_ps.pay_date last_pay_date
    
    from projects p
            left join
                        (select pp.project_id,max(pp.pay_date) as pay_date, pp.pay_sum 
                              from project_partuals pp
                              where pp.status in (2,4) and pp.pay_sum > 0 and pp.pay_date is not null 
                            group by pp.project_id, pp.pay_sum
                         ) last_date_ps on last_date_ps.project_id = p.id
    
          join contacts c on (p.debtor_contact_id=c.id)
    order by priority_value desc, name_f asc 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-31
      • 2021-07-20
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多