Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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

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 改进了从日期范围插入表的方法_Sql_Sql Server 2008 - Fatal编程技术网

Sql 改进了从日期范围插入表的方法

Sql 改进了从日期范围插入表的方法,sql,sql-server-2008,Sql,Sql Server 2008,我有两个表,一个是列表表,这是表的数据类型 create table List( CustNo Int, NoOverDue money, OverDue1 money, OverDue2 money, OverDue3 money, OverDue4 money ) 还有一个叫tablecost的桌子 create table tablecost( custno int, cost money, DueDate datetime,

我有两个表,一个是列表表,这是表的数据类型

create table List(
   CustNo Int,
   NoOverDue money,
   OverDue1 money,
   OverDue2 money,
   OverDue3 money,
   OverDue4 money
)
还有一个叫tablecost的桌子

create table tablecost(
    custno int,
    cost money,
    DueDate datetime,
    ListDate datetime
)
我的表中有太多的数据,所以我创建的数据列很少,以便您更快地解决我的问题

insert into tablecost values (1,100,'20130812','20130712')
insert into tablecost values (2,100,'20130612','20130712')
insert into tablecost values (3,100,'20130512','20130712') 
insert into tablecost values (4,100,'20130412','20130712') 
insert into tablecost values (5,100,'20130312','20130712') 
insert into tablecost values (6,100,'20130112','20130712') 
目的是插入到我的列表中 即:

如果我的决斗日期没有结束,它将插入nooverdue

如果逾期1至30天,则将其插入过量1

如果逾期31至60天,则将其插入过量2

如果逾期61至90天,则将其插入过量3

如果逾期91至120天,将插入过量4

这是我在查询中尝试的内容,它工作正常:

insert into List (CustNo, NoOverDue)
select CustNo,Cost from TableCost
where  DueDate > GetDate() 
and convert(varchar(8),ListDate,112) between '20130711' and '20130713'

insert into List (CustNo, OverDue1)
select CustNo,Cost from TableCost
where  DueDate between DateAdd(Day,-30,GetDate()) and DateAdd(Day,-1,GetDate()) 
and convert(varchar(8),ListDate,112) between '20130711' and '20130713'

insert into List (CustNo, OverDue2)
select CustNo,Cost from TableCost
where  DueDate between DateAdd(Day,-60,GetDate()) and DateAdd(Day,-31,GetDate())
and convert(varchar(8),ListDate,112) between '20130711' and '20130713'

insert into List (CustNo, OverDue3)
select CustNo,Cost from TableCost
where  DueDate between DateAdd(Day,-90,GetDate()) and DateAdd(Day,-61,GetDate()) 
and convert(varchar(8),ListDate,112) between '20130711' and '20130713'

insert into List (CustNo, OverDue4)
select CustNo,Cost from TableCost
where  DueDate between DateAdd(Day,-120,GetDate()) and DateAdd(Day,-91,GetDate()) 
and convert(varchar(8),ListDate,112) between '20130711' and '20130713'
我的问题是,有没有可能缩短或改进查询代码?
让此查询仅插入此表似乎需要很长时间

我同意您最好将数据的存储和显示需求分开的意见。但是如果你仍然需要实现你目前的目标,一个可能的解决方案可能是

插入列表CustNo、NoOverDue、OverDue1、OverDue2、OverDue3、OverDue4 选择客户编号 ,当ddiff<1时,则成本结束 ,当ddiff介于1和30之间时,则成本结束超出1 ,当ddiff介于31和60之间时,则成本结束超支2 ,当ddiff介于61和90之间时,则为成本结束超支3 ,当ddiff介于91和120之间时,则成本结束超支4 从…起 选择t.*、DATEDIFFDAY、duedate、GETDATE ddiff 从表中 其中,CONVERTVARCHAR8,ListDate,112介于“20130711”和“20130713”之间
DATEDIFFDAY、duedate、GETDATE不同的过期列之间似乎没有逻辑上的差异。这表明它们应该是一列。也许你需要的是卡斯特不,杜阿蒙,OverdueStatus,其中DueAmunt接收存储在这些列中的当前值,OverdueStatus是not或1的某种指示符-4@Damien_The_Unbeliever问题是我需要生成这种类型的报告,并且需要在特定的列上执行一些+和-值操作。显示数据的方式与存储数据的方式相差甚远。出于输出的目的,您可以执行一个命令。我只需引用Damien的话:数据存储常常是基于输出需要的。根据数据的逻辑、现实模式存储数据。然后根据您的需要执行输出查询/视图/报告。感谢您,它与以前的解决方案完全相同,而且缩短了很多时间