【问题标题】:SQL - How to count number of distinct values (payments), after sum of rows where they have another column value (Due Date) in commonSQL - 如何计算不同值(付款)的数量,在它们具有共同的另一个列值(到期日)的行总和之后
【发布时间】:2019-11-21 02:35:16
【问题描述】:

我的“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

【问题讨论】:

  • 您的示例数据显示 1000.00 和 1500.00。这些是如何计算的?
  • 基于截止日期。请参阅帖子顶部的表格 - 它在 6 月、7 月和 8 月的付款出现在 ID 123 和 456 中,因此总和为 1500。
  • 。 .在这几个月里,这两个 ID 都有付款。为什么另一个不是3000.00?
  • 我不想要相同 ID 的付款总和,我想要 ID 123 + ID 456 的总和,到期日期相同。

标签: sql count sum partition


【解决方案1】:

考虑到您早期的 cmets,我同意可以简化 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 fiddle:http://sqlfiddle.com/#!18/6b04f/1

【讨论】:

  • 圣母! ...就是这样,按预期工作并且更简单!谢谢@sjager!
【解决方案2】:

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

这个怎么样?

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;

【讨论】:

  • 谢谢,但是有了这个,我在两个不同的付款(500.00 中的 3 和 1000.00 中的 3)之间获得了共同的到期日计数。我需要将付款相加,然后用共同的到期日计数,因此将显示 3 of 500.00 和 3 of 1500.00
  • @Solera 。 . .您可以使用sum() 代替max()。您的样本数据不清楚。
【解决方案3】:

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

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;

当然,如果需要,您可以按 id 添加过滤器。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多