我有一张这样的表 - 它是特定客户的信用卡交易表:(正如您所知,当使用1月的信用卡时,2月份从该银行帐户收取的实际付款,主要是2019-02 -15但是有一项交易将在2019-02-10收取。
Customer orig_date Payment charge_date
100400 2019-01-01 500 2019-02-15
100400 2019-01-01 100 2019-02-10
100400 2019-01-01 400 2019-02-15
100400 2019-01-04 300 2019-02-15
100400 2019-01-09 100 2019-02-15
100400 2019-01-10 50 2019-02-15
100400 2019-02-09 1700 2019-03-15
100400 2019-02-13 800 2019-03-15
100400 2019-02-16 500 2019-03-15
而我想要的输出应该是这样的,每天我想在附近的一个字段中看到最接近的预期费用金额和收费发生的日期。
Customer Tr_Date ChargeDate Expected_Charge_Amt
100400 2019-01-01 2019-02-15 500
100400 2019-01-01 2019-02-10 100
100400 2019-01-02 2019-02-15 900
100400 2019-01-02 2019-02-10 100
100400 2019-01-03 2019-02-15 900
100400 2019-01-03 2019-02-10 100
100400 2019-01-04 2019-02-15 1200
100400 2019-01-04 2019-02-10 100
100400 2019-01-05 2019-02-15 1200
100400 2019-01-05 2019-02-10 100
100400 2019-01-06 2019-02-15 1200
100400 2019-01-06 2019-02-10 100
100400 2019-01-07 2019-02-15 1200
100400 2019-01-07 2019-02-10 100
100400 2019-01-08 2019-02-15 1200
100400 2019-01-08 2019-02-10 100
100400 2019-01-09 2019-02-15 1300
100400 2019-01-09 2019-02-10 100
100400 2019-01-10 2019-02-15 1350
100400 2019-01-10 2019-02-10 100
...... {所有日期之间没有变化}
100400 2019-01-31 2019-02-15 1350
100400 2019-01-31 2019-02-10 100
...... {所有日期之间没有变化}
100400 2019-02-09 2019-02-15 1350
100400 2019-02-09 2019-02-10 100
100400 2019-02-09 2019-03-15 1700
100400 2019-02-10 2019-02-15 1350
100400 2019-02-10 2019-03-15 1700
...... {所有日期之间没有变化}
100400 2019-02-14 2019-02-15 1350
100400 2019-02-14 2019-03-15 2500
.. {所有日期之间没有变化}
100400 2019-02-15 2019-03-15 3000
100400 2019-02-16 2019-03-15 3000
我希望你能得到algoritem的观点。我真的很难为此写一个查询。你能帮助我吗?
它有点不清楚你想要实现什么。您想要总结客户的预期费用,orig_date
的月份和charge_date
的日期吗?
如果是这样,这样的事情应该有效:
SELECT
customer,
cast(orig_date as DATE) as orig_month,
charge_date,
sum(payment) as Expected_Charge_amt
from table_name
group by customer, cast(orig_date as DATE), charge_date
如果我理解正确,您需要所有待处理的交易。
为此,请从日期列表开始。然后是cross apply
或join
:
with dates as
select convert(date, '2019-01-01') as dte
union all
select dateadd(day, 1, dte)
from dates
where dte < '2019-02-28'
)
select t.customer, d.dte as tr_date, t.charge_date,
t.payment as expected_chart_amount
from dates d join
transactions t
on d.dte >= t.orig_date and
d.dte <= t.charge_date
where t.customer = 100400
order by d.dte, t.charge_date;