表A: 编号 数量 日期
1 2 20090301
2 5 20090302
2 1 20090201
3 2 20090101
3 3 20090101
日期是一个开放条件(是一个时间段,如:20090201-200900301),
怎么样查询出比开放条件小的日期,所有相同编号的数量相加,
如开放条件选20090201-200900301),那么查处的就是: 编号 数量
2 1
3 5
我是这样写的
select A.编号,数量=(select sum(B.数量)from 表A as B where B.日期<min(A.日期) and B.编号=A.编号 )
FROM 表A as A
提示:SQL语句内部错误 ,请问为什么啊。
开放条件是取:表A as A 这个表不能放子查询中。
1 2 20090301
2 5 20090302
2 1 20090201
3 2 20090101
3 3 20090101
日期是一个开放条件(是一个时间段,如:20090201-200900301),
怎么样查询出比开放条件小的日期,所有相同编号的数量相加,
如开放条件选20090201-200900301),那么查处的就是: 编号 数量
2 1
3 5
我是这样写的
select A.编号,数量=(select sum(B.数量)from 表A as B where B.日期<min(A.日期) and B.编号=A.编号 )
FROM 表A as A
提示:SQL语句内部错误 ,请问为什么啊。
开放条件是取:表A as A 这个表不能放子查询中。
select 编号,sum(数量) 数量 from 表A where 日期<='20090201'
select 编号,sum(数量) 数量 from 表A where 日期<='20090201' group by 编号
select 编号,sum(数量) 数量 from 表A where 日期<='20090201' group by 编号
select 编号,sum(数量) 数量 from 表A where 日期<='20090201' group by 编号
--那就把'20090201'换成你的变量时间就可以了。
select 编号,sum(数量) 数量 from 表A where 日期<=@小的日期 group by 编号
select 编号 , sum(数量) from tb where 日期 < 你给定的日期 group by 编号
insert into tb values(1 , 2 , '20090301')
insert into tb values(2 , 5 , '20090302')
insert into tb values(2 , 1 , '20090201')
insert into tb values(3 , 2 , '20090101')
insert into tb values(3 , 3 , '20090101')
godeclare @dt1 as datetime
declare @dt2 as datetime
set @dt1 = '20090201'
set @dt2 = '20090301'select 编号 , sum(数量) 数量 from tb where 日期 <= (case when @dt1 < @dt2 then @dt1 else @dt2 end) group by 编号drop table tb /*
编号 数量
----------- -----------
2 1
3 5(所影响的行数为 2 行)*/
declare @dt2 as datetime
set @dt1 = '20090201'
set @dt2 = '20090301'这个不是时间点,而是代表从@dt1到@dt2,或者是从@dt2到@dt1,然后用case when转换你需要的最小值.
你取最小的时间的话,不可能出现在 @dt1 , @dt2之间.
insert into tb values(1 , 2 , '20090301')
insert into tb values(2 , 5 , '20090302')
insert into tb values(2 , 1 , '20090201')
insert into tb values(3 , 2 , '20090101')
insert into tb values(3 , 3 , '20090101')
godeclare @dt1 as datetime
declare @dt2 as datetime
set @dt1 = '20090201'
set @dt2 = '20090301'select 编号 , sum(数量) 数量 from tb where 日期 <= (case when @dt1 > @dt2 then @dt1 else @dt2 end) group by 编号drop table tb 编号 数量
----------- -----------
1 2
2 1
3 5(3 行受影响)那将它改小于号为大于号不就行了?
如果下面的还不对,你自己根据我的思路去取你需要的时间.create table tb(编号 int, 数量 int, 日期 datetime)
insert into tb values(1 , 2 , '20090301')
insert into tb values(2 , 5 , '20090302')
insert into tb values(2 , 1 , '20090201')
insert into tb values(3 , 2 , '20090101')
insert into tb values(3 , 3 , '20090101')
godeclare @dt1 as datetime
declare @dt2 as datetime
set @dt1 = '20090201'
set @dt2 = '20090301'--取小于最小时间的。
select 编号 , sum(数量) 数量 from tb where 日期 <= (case when @dt1 < @dt2 then @dt1 else @dt2 end) group by 编号
/*
编号 数量
----------- -----------
2 1
3 5(所影响的行数为 2 行)
*/--取大于最大时间的。
select 编号 , sum(数量) 数量 from tb where 日期 >= (case when @dt1 < @dt2 then @dt2 else @dt1 end) group by 编号
/*
编号 数量
----------- -----------
1 2
2 5(所影响的行数为 2 行)
*/--取两个时间之间的。
select 编号 , sum(数量) 数量 from tb where 日期 >= (case when @dt1 < @dt2 then @dt1 else @dt2 end) and 日期 <= (case when @dt1 < @dt2 then @dt2 else @dt1 end) group by 编号
/*
编号 数量
----------- -----------
1 2
2 1(所影响的行数为 2 行)
*/drop table tb
insert into tb values(1 , 2 , '20090301')
insert into tb values(2 , 5 , '20090302')
insert into tb values(2 , 1 , '20090201')
insert into tb values(3 , 2 , '20090101')
insert into tb values(3 , 3 , '20090101')
godeclare @dt1 as datetime
declare @dt2 as datetime
set @dt1 = '20090201'
set @dt2 = '20090301'select 编号 , sum(数量) 数量 from tb where 日期 < (case when @dt1 < @dt2 then @dt1 else @dt2 end) and 编号 in
(
select distinct 编号 from tb where 日期 >= (case when @dt1 < @dt2 then @dt1 else @dt2 end) and 日期 <= (case when @dt1 < @dt2 then @dt2 else @dt1 end)
)
group by 编号
/*
号 数量
----------- ----------- (所影响的行数为 0 行)*/drop table tb