删除了我最初的问题,因为不确定它是明确的,并决定新的方法可能是最好的前进方式。
我有一个表,里面有我们收到的付款的详细信息。我们称之为tblPayments,它有一个类似于(example)的设置
DatePayment | AccountNo | value | TransactionNo
26/05/2014 | 123456 | 5.99 | 5845878987
26/06/2014 | 123456 | 5.99 | 5845879585我的任务是在累积的基础上创建一份破损报告,标准是2次付款被遗漏,它被归类为破损。
示例:账号123456每月支付5.99%。他在2014年6月付款,但随后在7月或8月没有付款,这使这成为8月的破损,直到12月才继续付款,这意味着直到12月才累计破损。
我之前用来计算破坏的查询是使用一条EXCEPT语句完成的,该语句在不需要累积数据的情况下执行所需的操作。我会发布我使用的查询,但它很长,并且之前有其逻辑被理解的问题。因此,展望未来,想一想一种新的、更智能的方式来获取数据。
期望的输出将是:
MonthBreakage | AccountNo | BreakageValue
01-Aug-2014 | 123456 | 5.99
01-Sep-2014 | 123456 | 5.99
01-Oct-2014 | 123456 | 5.99
01-Nov-2014 | 123456 | 5.99
01-Dec-2014 | NULL | NULL空值只是为了突出显示记录不再是一种破坏。
任何问题请让我知道,我希望我已经足够清楚/
发布于 2015-02-26 19:27:31
我不能给你一个完整的答案,但我没有时间了,所以这是我到目前为止所知道的:
with months as (
select 1 as mkey
union
select 2
union
select 3
union
select 4
union
select 5
union
select 6
union
select 7
union
select 8
union
select 9
union
select 10
union
select 11
union
select 12
)
select mkey, cast('2014-'+cast(mkey as varchar)+'-01' as date) as MonthBreakage, p.*
from months left outer join tblPayments as p on mkey = month(DatePayment)
where mkey > (select max(month(DatePayment)) from tblPayments)你可以在working in a fiddle here上看到它。希望这能有所帮助。
发布于 2015-02-27 00:52:28
我只是对@Turophile给出的答案做了两周中的一次。
由于联合必须排序和挑选重复项(即使没有任何重复项,也必须检查),因此在cte月份中使用联合all而不是联合
或者..。返工月数为
with months as (
select 1 as mkey
union all
select mkey + 1
from months
where mkey < 12
)https://stackoverflow.com/questions/28738664
复制相似问题