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;
当然,您可以根据需要添加过滤器。
我的'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;
当然,您可以根据需要添加过滤器。