Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008累积付款-修订版_Sql_Sql Server 2008 - Fatal编程技术网

SQL Server 2008累积付款-修订版

SQL Server 2008累积付款-修订版,sql,sql-server-2008,Sql,Sql Server 2008,删除了我原来的问题,因为我不确定问题是否清楚,并决定采用新的方法可能是最好的解决办法 我有一张表格,上面有我们收到的付款的详细信息。我们称之为tblPayments,它有一个类似于示例的设置 DatePayment | AccountNo | value | TransactionNo 26/05/2014 | 123456 | 5.99 | 5845878987 26/06/2014 | 123456 | 5.99 | 5845879585 我的任务是在累积的基础上创建一

删除了我原来的问题,因为我不确定问题是否清楚,并决定采用新的方法可能是最好的解决办法

我有一张表格,上面有我们收到的付款的详细信息。我们称之为tblPayments,它有一个类似于示例的设置

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语句完成的,当不需要累积数字时,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
空值只是为了突出显示记录不再是破损记录


如果有任何问题,请让我知道,我希望我已经足够清楚了/

我没有完整的答案给你,但我没时间了,所以我到目前为止有以下内容:

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)
你可以看到。
希望这会有所帮助。

我只想对@Turophile给出的答案做两个选择中的一个

由于联合会必须在没有任何副本的情况下对副本进行排序和挑选,因此它必须进行检查,所以在cte月份使用联合会all而不是联合会

或者。。。返工月份为

    with months as (
        select 1 as mkey 
        union all
        select mkey + 1
        from months
        where mkey < 12
    )

请注意:SQL通常不太擅长这种“告诉我缺少什么”类型的问题,因为它是为查询数据库中的数据而设计的。我很想看看你得到的答案。但使用过程代码可能更容易做到这一点。在您的例子中,这意味着一个存储过程,我猜。十二月属于输出吗?那个月有一笔付款,不是吗?因此没有破损,我想你用空值表示,但为什么要显示它呢?为什么不在输出中显示6月和7月?@turphile-I仅将Dec显示为空。例如,从12月起,帐户123456将不再在表中。我只想显示从破损月份一直存在到付款的账户破损金额值是否来自破损前最后一次付款的值?@turphile是的,但如果需要,可以删除该字段。