关于sql 2000的日期问题,较复杂
我有一张表,字段为id,hpid,storage,date,意思是id,库存数和日期。
同一id的记录不是每天都有,现在我想查询出某段时间内的库存数量,该如何编写sql语句?
比如表内容如下:
id hpid storage date
1 1 1000 2012-10-10
2 1 2000 2012-10-12
3 1 5000 2012-10-13
4 1 5000 2012-10-14
5 1 4500 2012-10-18
6 1 5340 2012-10-22
7 1 684 2012-11-28
8 1 10000 2012-12-12
同一hpid,并不是每天都有记录,但是查询结果想要显示10~11月份每天的数据,如果当天没数据,则显示上条数据的记录。
搜索结果应该如下:
hpid storage date
1 0 2012-10-1
1 0 2012-10-2
1 0 2012-10-2
......
1 1000 2012-10-10
1 1000 2012-10-11
1 2000 2012-10-12
1 5000 2012-10-13
1 5000 2012-10-14
1 5000 2012-10-15
1 5000 2012-10-16
......
1 684 2012-11-30
想得到上述结果,想了很久不知如何编写sql语句,望大家指教!
------解决方案--------------------
declare @库存表 table(id int,hpid int,storage varchar(50),[date] date)
insert into @库存表
select 1,1,1000,'2012-10-10'
union all
select 2,1,2000,'2012-10-12'
union all
select 3,1,5000,'2012-10-13'
union all
select 4,1,5000,'2012-10-14'
union all
select 5,1,4500,'2012-10-18'
union all
select 6,1,5340,'2012-10-22'
union all
select 7,1,684,'2012-11-28'
union all
select 8,1,10000,'2012-12-12'
select
number
,hpid
,isnull(isnull(storage,
(
select top 1 storage from
(
select
d.number,h.hpid,s.storage,DATEADD(dd,d.number,'2012-10-01') [date]
from
(select * from master..spt_values where type='p' and number between 0 and (select DATEDIFF(dd,'2012-10-01','2012-11-30'))) d
cross join (select distinct hpid from @库存表) h
left join @库存表 s on h.hpid=s.hpid and DATEADD(dd,d.number,'2012-10-01')=s.date
) tt
where hpid=t.hpid and number<t.number and storage is not null order by number desc
))
,0) storage
,[date]
from
(
select
d.number,h.hpid,s.storage,DATEADD(dd,d.number,'2012-10-01') [date]
from
(select * from master..spt_values where type='p' and number between 0 and (select DATEDIFF(dd,'2012-10-01','2012-11-30'))) d
cross join (select distinct hpid from @库存表) h
left join @库存表 s on h.hpid=s.hpid and DATEADD(dd,d.number,'2012-10-01')=s.date
) t
------解决方案--------------------
SQL code
--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tb
GO
CREATE TABLE #tb([id] INT,[hpid] INT,[storage] INT,[date] DATETIME)
INSERT #tb
SELECT 1,1,1000,'2012-10-10' UNION ALL
SELECT 2,1,2000,'2012-10-12' UNION ALL
SELECT 3,1,5000,'2012-10-13' UNION ALL
SELECT 4,1,5000,'2012-10-14' UNION ALL
SELECT 5,1,4500,'2012-10-18' UNION ALL
SELECT 6,1,5340,'2012-10-22' UNION ALL
SELECT 7,1,684,'2012-11-28' UNION ALL
SELECT 8,1,10000,'2012-12-12'
--------------开始查询--------------------------
DECLARE @begindate DATETIME,@endtime DATETIME
SET @begindate='2012-10-01'
SET @endtime='2012-11-30'
SELECT [id]=ISNULL((SELECT MAX([id]) FROM #tb WHERE [date]<=b.[date] ),1),
[hpid]=ISNULL((SELECT MAX([hpid]) FROM #tb WHERE [date]<=b.[date] ),1),
[storage]=ISNULL((SELECT MAX([storage]) FROM #tb WHERE [date]<=b.[date]),0),
[date]
FROM (
SELECT DATEADD(dd,number,@begindate) AS [date] ,[id],[hpid],[storage]
FROM master..spt_values
LEFT JOIN #tb b ON DATEADD(dd,number,@begindate)=b.[date]
WHERE type=