商品名称  数量  进出货  时间袜子      100      1       2007-05-01
袜子      50       1       2007-06-01
袜子      50      -1       2007-06-03
靴子      120      1       2007-05-02
靴子      50      -1       2007-05-03上述是一个进货记录
进出货= -1 表示 商品卖出了,=1代表进货了。我想得到所有商品在某时刻的数量。
即:在某时刻前的记录里,将各商品的数量乘以进出货,然后将得到的值与相同商品记录里得到的这个值相加。
袜子数量=100*1+50*1+50*(-1)=100
靴子数量=12081+50*(-1)=70
上述例子假设截止到今天那么得到的记录集应该是商品名称  数量    截止时间袜子      100     2007-07-03
靴子      70      2007-07-03

解决方案 »

  1.   

    create table test(商品名称 varchar(10),数量 int,进出货 int,时间 datetime)
    insert test select '袜子',100,1,'2007-05-01'
    union all select '袜子',50,1,'2007-06-01'
    union all select '袜子',50,-1,'2007-06-03'
    union all select '靴子',120,1,'2007-05-02'
    union all select '靴子',50,-1,'2007-05-03'select 商品名称,数量=sum(case when 进出货=1 then abs(数量*进出货) else -abs(数量*进出货) end),
    截至日期=convert(char(10),getdate(),120)
    from test group by 商品名称
      

  2.   

    改下
    select 商品名称,
    数量=(select sum(case 进出货 when 1 then abs(数量*进出货) else -abs(数量*进出货) end) 
    from test where 商品名称=a.商品名称 and 时间<=getdate()),
    截至日期=convert(char(10),getdate(),120)
    from test a
    group by 商品名称商品名称       数量          截至日期       
    ---------- ----------- ---------- 
    袜子         100         2007-07-03
    靴子         70          2007-07-03
      

  3.   

    select 商品名称,
    数量=(select sum(case 进出货 when 1 then abs(数量*进出货) else -abs(数量*进出货) end) 
    from test where 商品名称=a.商品名称 and 时间<=getdate()),
    截至日期=convert(char(10),getdate(),120)
    from test a
    group by 商品名称
    ==============
    冒昧的问一下,为什么要这样呢?之前的不的效率更高吗?
      

  4.   

    mugua604(熟不了的木瓜) ( )
    呵呵,我想多了,你说的对
    原来以为时间要有限制才改的,楼主的时间字段是不会超过getdate()的
      

  5.   

    select 商品名称,数量=sum(case when 进出货=1 then 数量 else -数量 end),
    截至日期=convert(char(10),getdate(),120)
    from test group by 商品名称
      

  6.   

    借熊兄的测试环境一用。select 商品名称,sum(数量*进出货) 数量,convert(char(10),getdate(),120) 截至日期
    from test
    where 时间<=getdate()
    group by 商品名称感觉这样就行了。