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

SQL - How to count number of distinct values (payments), after sum of rows where they have another column value (Due Date) in common

我的'deals_payments'table是:

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

我尝试了下面的方法,但它给了我 'missing right parenthesis' 错误。怎么了??

    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

这看起来真的很奇怪。我不明白你的逻辑为什么这么复杂。

这个怎么样?

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;

考虑到您之前的评论,我同意可以简化 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

这里有一个sqlfiddle我用来验证:http://sqlfiddle.com/#!18/6b04f/1

一个有趣的问题。这能解决问题吗???

select payment, count(*)
  from deals_payments 
 where due_date in 
(select due_date
  from deals_payments
  group by due_date
  having count(*) > 1)
 group by payment;

当然,您可以根据需要添加过滤器。