现在有一张表
订单编号 订单数量 订单时间 物品编号 交货时间
A00001 50 2011-11-02 W001 2011-12-02
A00001 60 2011-12-02 W001 2011-12-07
A00001 70 2012-01-02 W001 2012-02-04
A00002 80 2011-12-02 W002 2011-12-02
A00003 90 2011-12-02 W002 2011-12-02
要求是根据当前时间获取最近的一次下的订单数据。
订单编号 订单数量 订单时间 物品编号 交货时间
A00001 70 2012-01-02 W001 2012-02-04
A00002/ A00003 170 2011-12-02 W002 2011-12-02/2011-12-02请教大侠们这个sql该怎么写?
由其是最近一次的该怎么写,合并的会写。
declare @表 table
(
订单编号 varchar(6),
订单数量 int,
订单时间 datetime,
物品编号 varchar(4),
交货时间 datetime
)
insert into @表
select 'a00001',50,'2011-11-02','w001','2011-12-02' union all
select 'a00001',60,'2011-12-02','w001','2011-12-07' union all
select 'a00001',70,'2012-01-02','w001','2012-02-04' union all
select 'a00002',80,'2011-12-02','w002','2011-12-02' union all
select 'a00003',90,'2011-12-02','w002','2011-12-02'select 订单编号 ,
订单数量 ,
订单时间 = convert(varchar(10), 订单时间, 120) ,
物品编号 ,
交货时间 = convert(varchar(10), 交货时间, 120)
from @表 t
where 订单时间 = ( select max(订单时间)
from @表
where 物品编号 = t.物品编号
)
/*
订单编号 订单数量 订单时间 物品编号 交货时间
------ ----------- ---------- ---- ----------
a00002 80 2011-12-02 w002 2011-12-02
a00003 90 2011-12-02 w002 2011-12-02
a00001 70 2012-01-02 w001 2012-02-04
*/
declare @表 table
(
订单编号 varchar(6),
订单数量 int,
订单时间 datetime,
物品编号 varchar(4),
交货时间 datetime
)
insert into @表
select 'a00001',50,'2011-11-02','w001','2011-12-02' union all
select 'a00001',60,'2011-12-02','w001','2011-12-07' union all
select 'a00001',70,'2012-01-02','w001','2012-02-04' union all
select 'a00002',80,'2011-12-02','w002','2011-12-02' union all
select 'a00003',90,'2011-12-02','w002','2011-12-02';WITH maco AS(
select 订单编号 ,
订单数量 ,
订单时间 = convert(varchar(10), 订单时间, 120) ,
物品编号 ,
交货时间 = convert(varchar(10), 交货时间, 120)
from @表 t
where 订单时间 = ( select max(订单时间)
from @表
where 物品编号 = t.物品编号
))
select
订单编号=stuff((select '/'+订单编号 from maco t where 物品编号=b.物品编号 for xml path('')), 1, 1, ''),
订单数量=sum(订单数量),
订单时间,物品编号,
交货时间=stuff((select '/'+交货时间 from maco t where 物品编号=b.物品编号 for xml path('')), 1, 1, '')
from maco b group by 物品编号,订单时间/*
订单编号 订单数量 订单时间 物品编号 交货时间
--------------- ----------- ---------- -------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
a00002/a00003 170 2011-12-02 w002 2011-12-02/2011-12-02
a00001 70 2012-01-02 w001 2012-02-04
*/
go
create table [tb]([订单编号] varchar(6),[订单数量] int,[订单时间] varchar(10),[物品编号] varchar(4),[交货时间] varchar(10))
insert [tb]
select 'A00001',50,'2011-11-02','W001','2011-12-02' union all
select 'A00001',60,'2011-12-02','W001','2011-12-07' union all
select 'A00001',70,'2012-01-02','W001','2012-02-04' union all
select 'A00002',80,'2011-12-02','W002','2011-12-02' union all
select 'A00003',90,'2011-12-02','W002','2011-12-02';with t1 as(
select * from tb t
where 订单时间=(select top 1 订单时间 from tb where 订单编号=t.订单编号 and 订单时间<getdate() order by 订单时间 desc)
)
select
订单编号=stuff((select '/'+订单编号 from t1 where 订单时间=t.订单时间 and 物品编号=t.物品编号 for xml path('')),1,1,''),
订单数量=sum(订单数量),
订单时间,
物品编号,
交货时间=stuff((select '/'+交货时间 from t1 where 订单时间=t.订单时间 and 物品编号=t.物品编号 for xml path('')),1,1,'')
from t1 t
group by 订单时间,物品编号
/**
订单编号 订单数量 订单时间 物品编号 交货时间
A00001 70 2012-01-02 W001 2012-02-04
A00002/A00003 170 2011-12-02 W002 2011-12-02/2011-12-02
**/
(
订单编号 varchar(6),
订单数量 int,
订单时间 date,
物品编号 varchar(4),
交货时间 date
)insert into #tb
select 'a00001',50,'2011-11-02','w001','2011-12-02' union all
select 'a00001',60,'2011-12-02','w001','2011-12-07' union all
select 'a00001',70,'2012-01-02','w001','2012-02-04' union all
select 'a00002',80,'2011-12-02','w002','2011-12-02' union all
select 'a00003',90,'2011-12-02','w002','2011-12-02'
go
select * from #tb
go
with cte as
(select 订单编号,订单数量,订单时间,物品编号,交货时间 from
(select rowid=ROW_NUMBER()over(partition by 订单编号 order by 订单时间),* from #tb) a where rowid=1
)
select 订单编号=STUFF((select '/'+订单编号 from cte where 物品编号=m.物品编号 for xml path('')),1,1,''),
订单数量=sum(订单数量),订单时间,物品编号,
交货时间=stuff((select '/'+convert(varchar(10),交货时间) from cte where 物品编号=m.物品编号 for xml path('')),1,1,'')
from cte m
group by 订单时间,物品编号
订单编号 订单数量 订单时间 物品编号 交货时间
a00001 50 2011-11-02 w001 2011-12-02
a00002/a00003 170 2011-12-02 w002 2011-12-02/2011-12-02(2 行受影响)
declare @表 table
(
订单编号 varchar(6),
订单数量 int,
订单时间 datetime,
物品编号 varchar(4),
交货时间 datetime
)
insert into @表
select 'a00001',50,'2011-11-02','w001','2011-12-02' union all
select 'a00001',60,'2011-12-02','w001','2011-12-07' union all
select 'a00001',70,'2012-01-02','w001','2012-02-04' union all
select 'a00002',80,'2011-12-02','w002','2011-12-02' union all
select 'a00003',90,'2011-12-02','w002','2011-12-02'
select stuff((select '/'+订单编号 from @表 where 订单时间=a.订单时间 and 物品编号=a.物品编号 for xml path('')),1,1,'') as 订单编号,
sum(a.订单数量) as 订单数量,
a.订单时间,
a.物品编号,
stuff((select '/'+cast(交货时间 as nvarchar(20)) from @表 where 订单时间=a.订单时间 and 物品编号=a.物品编号 for xml path('')),1,1,'') as 交货时间
from @表 as a
join
(
select 订单编号,max(订单时间) as 最近订单时间
from @表
group by 订单编号
) as b on a.订单编号=b.订单编号 and a.订单时间=b.最近订单时间
group by a.订单时间,
a.物品编号订单编号 订单数量 订单时间 物品编号 交货时间
a00001 70 2012-01-02 00:00:00.000 w001 02 4 2012 12:00AM
a00002/a00003 170 2011-12-02 00:00:00.000 w002 12 2 2011 12:00AM/12 2 2011 12:00AM非常感谢这个帖子,我做程序员十多年了,一直也是从事数据库开发,但不是知道这个字符串的连接,这回我知道了,非常感谢,我从没用过STUFF这个函数,只是里面的参数什么的我还没搞明白,楼主想要知道的问题在我这倒是很简单的。