SQL-如何计算不同值(付款)的数目,在它们具有另一个共同的列值(到期日)的行的总和之后

问题描述 投票:0回答:2

我的'deals_payments'表为:

Due Date    Payment     ID
1-Mar-19    1,000.00    123
1-Apr-19    1,000.00    123
1-May-19    1,000.00    123
1-Jun-19    1,000.00    123
1-Jul-19    1,000.00    123
1-Aug-19    1,000.00    123
1-Jun-19    500.00      456
1-Jul-19    500.00      456
1-Aug-19    500.00      456

我有SQL代码:

select 
   count(*), payment

from (select deals_payments.*,
             (row_number() over (order by due_date) -
              row_number() over (partition by payment order by due_date)
             ) as grp
      from deals_payments
       where id = 123
           ) deals_payments
group by grp, payment
order by grp

这给了我我想要的-每个不同金额的付款数量-(这里我只要求输入ID 123):

COUNT(*)    PAYMENT
6           1000.00

但是现在我需要两个ID(分别为123和456)的到期日相同的付款总和,并计算每个不同金额的付款次数,如:

COUNT(*)    PAYMENT
3           1000.00
3           1500.00

我尝试了以下操作,但这给了我“缺少右括号”错误。怎么了?

    select 
      count(*), 
      (select 
          sum(total) total
       from (select distinct 
                due_date,
                (select 
                   sum(payment) 
                from deals_payments 
                where  (due_date = a.due_date)) as total
             from deals_payments a 
             where a.id in (123, 456) 
             and payment > 0)

        group by due_date
        order by due_date)  b

    from (select deals_payments.*,
                     (row_number() over (order by due_date) -
                              row_number() over (partition by payment order by due_date)
                             ) as grp
                      from deals_payments
                       where id = 123
                           ) deals_payments
                group by grp, payment
                order by grp
sql count sum partition
2个回答
0
投票

这似乎真的很奇怪。我不明白为什么您的逻辑如此复杂。

怎么样?

select id, count(*), max(payment)
from (select dp.*,
             count(*) over (partition by due_date) as cnt
      from deal_payments dp
      where dp.id in (123, 456)
     ) dp
where cnt = 2
group by id;

0
投票

考虑您之前的评论,我同意可以简化SQL以得到预期的结果。我的理解是,预期输出是在任何给定日期总支付ID子集的频率。

select count(*) as PaymentFrequency, TotalPaidOnDueDate from
(
    select due_date, sum(payment) as TotalPaidOnDueDate from #deals_payments
    where ID in (123, 456)
    group by due_date
) a
group by a.TotalPaidOnDueDate

这是我用来验证的SQL小提琴:http://sqlfiddle.com/#!18/6b04f/1

© www.soinside.com 2019 - 2024. All rights reserved.