SQL根据逐个查询的结果插入到表中

时间:2016-03-19 08:44:57

标签: sql-server

有一个客户表我想删除任何超过1年的时间。

目前我有以下查询,它会返回每个客户超过1年的时间。

    select Customer, SUM(Time) as TimeTotal
    from CutomerTable
    WHERE Entry_Date_Time < DATEADD(YEAR,-1,CURRENT_TIMESTAMP)
    group by Customer

如果可能的话,最好在每个客户的客户表中插入时间列中超过一年的时间的负值。目前我将结果导出到excel并逐行插入以更新表。

我应该阅读的任何建议或材料都会很棒。

对不起的例子

实施例

Customer    Time        Entry_date_Time
1       30      2014-12-20 22:35:00.000                     
2       10      2014-12-20 22:35:00.000
3       15      2015-12-20 22:35:00.000
1       40      2015-12-20 22:35:00.000

目前该表格将显示

Customer    Time
1       70
2       10      
3       15

我只希望它显示去年的时间。

Customer    Time
1       40
2       0
3       15

1 个答案:

答案 0 :(得分:0)

如果您希望获得超过一年但不迟于两年的时间段的TimeTotal(如您的示例所示),那么您需要设置如下所示的日期范围:

declare
  @datebegin  date,
  @dateend    date

set @dateend = DATEADD(YEAR,-1,CURRENT_TIMESTAMP)
set @datebegin = DATEADD(YEAR, -1, @dateend)

select c.Customer, ct.TimeTotal_LastYear
from Customers c
left join
(
    select ct.Customer, SUM(Time) as TimeTotal
    from CutomerTable ct
    WHERE ct.Entry_Date_Time between @datebegin and @dateend
    group by ct.Customer
) t on ct.Customer = c.Customer

如果您希望接收定义期间没有相应行的客户,请使用上面脚本中显示的left joinouter apply的相同方案。

修改

实际上你的例子令人困惑:所应用的过滤器“比一年前更早”,显示的数据 - 比一年前更晚。如果你只需要去年,那么过滤谓词必须更简单一些:

declare
  @datebegin  date

set @datebegin = DATEADD(YEAR,-1,CURRENT_TIMESTAMP)

select c.Customer, ct.TimeTotal_LastYear
from Customers c
left join
(
    select ct.Customer, SUM(Time) as TimeTotal
    from CutomerTable ct
    WHERE ct.Entry_Date_Time >= @datebegin
    group by ct.Customer
) t on ct.Customer = c.Customer

groupby方法中,您可以将<>的比较反转。