表格如下
商品编号 存放位置 存入时间
1 1柜 2000-01-01
1 2柜 2000-02-01
1 1柜 2000-02-102 2柜 2000-01-10
2 1柜 2000-01-203 3柜 2000-01-02
3 4柜 2000-01-05
3 3柜 2000-01-10
3 4柜 2000-01-20求一SQL,统计每种商品在每个柜中存放的天数,必须用一条SQL命令完成,要求结果如下:
统计截止日期,2000-02-10
商品编号 存放位置 存放天数
1 1柜 31
1 2柜 102 1柜 21
2 2柜 103 3柜 13
3 4柜 21
商品编号 存放位置 存入时间
1 1柜 2000-01-01
1 2柜 2000-02-01
1 1柜 2000-02-102 2柜 2000-01-10
2 1柜 2000-01-203 3柜 2000-01-02
3 4柜 2000-01-05
3 3柜 2000-01-10
3 4柜 2000-01-20求一SQL,统计每种商品在每个柜中存放的天数,必须用一条SQL命令完成,要求结果如下:
统计截止日期,2000-02-10
商品编号 存放位置 存放天数
1 1柜 31
1 2柜 102 1柜 21
2 2柜 103 3柜 13
3 4柜 21
if object_id('tempdb.dbo.#') is not null drop table #
create table #(商品编号 int, 存放位置 varchar(8), 存入时间 datetime)
insert into #
select 1, '1柜', '2000-01-01' union all
select 1, '2柜', '2000-02-01' union all
select 1, '1柜', '2000-02-10' union all
select 2, '2柜', '2000-01-10' union all
select 2, '1柜', '2000-01-20' union all
select 3, '3柜', '2000-01-02' union all
select 3, '4柜', '2000-01-05' union all
select 3, '3柜', '2000-01-10' union all
select 3, '4柜', '2000-01-20'-- parameter
declare @d datetime
set @d = '2000-02-10';-- query
with cte as
(
select *, rn=row_number()over(partition by 商品编号 order by 存入时间) from # where 存入时间<=@d
)
select a.商品编号,a.存放位置, days=sum(datediff(day,a.存入时间,isnull(b.存入时间,@d))) from cte a left join cte b on a.商品编号=b.商品编号 and a.rn=b.rn-1 group by a.商品编号,a.存放位置 order by 1,2/*
商品编号 存放位置 days
----------- ----------- -----------
1 1柜 31
1 2柜 9
2 1柜 21
2 2柜 10
3 3柜 13
3 4柜 26
*/
from 表 group by 商品编号,存放位置
from 表 group by 商品编号,存放位置 select 商品编号,存放位置,sum(datediff(day,存入时间,'2000-02-10')+1)
from 表 group by 商品编号,存放位置
from 表 group by 商品编号,存放位置
从每种商品第一次入柜日期开始,截止到2000-02-10,统计每种商品在每个柜中存放的天数,用一条SQL命令完成
group by id,address having max(time)<'2000-02-10'
服了你,那我在1楼不是给你算对了吗?不喜欢变量,那就用常量代入,不喜欢换行就取消换行,query部分就是1句SQL。