现在有一张表
订单编号 订单数量  订单时间  物品编号  交货时间
 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该怎么写?
由其是最近一次的该怎么写,合并的会写。

解决方案 »

  1.   


    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
    */
      

  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';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
    */
      

  3.   

    if object_id('[tb]') is not null drop table [tb]
    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
    **/
      

  4.   

    create table  #tb
    (
        订单编号 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 行受影响)
      

  5.   


    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这个函数,只是里面的参数什么的我还没搞明白,楼主想要知道的问题在我这倒是很简单的。
      

  6.   

    我主要是for xml path('')不明白,原来是2005以后才有的呀,看来不能总是埋头编程序了,也得逛逛论坛,回答问题只也能学到东西哟,现在我一工作就是后半夜根本没时间逛论坛,这回是CSDN账户出问题,才回来转转,记得当初,这得有快十年了,我天天不知道来这逛多少次,那时能力也不如现在,但是总是愿意看帖,有我会的就答,哎现在忙了,睡觉都没什么时间,逛论坛更是不容易了。