有表A,  分别为:id(编号),num(号码),name(名称),dept(部门),amount(数量),u_name(使用人),status(状态),times
现状:   销售部有电脑三台,分别为G1,G2,G3。
模拟情景1:销售部今天退还IT部电脑两台,分别为G1,G2。再从IT部领取两台电脑分别为G8,G9。从而销售部现有电脑还是为三台,分别为编号G3,G8,G9。
模拟情景2:销售部第二天退还IT部电脑一台,编号为G8,从IT部领取一台电脑为G10,销售部现有电脑还是为三台,分别为编号G3,G9,G10数据表现(有G1,G2,G3数据为原始库存)
1001  G1   电脑     销售部    1    张三      退还     今天
1002  G2   电脑     销售部    1    张三      退还     今天
1003  G8   电脑     销售部    1    张三      领取     今天
1004  G9   电脑    销售部    1    张三      领取     今天
1005  G8  电脑    销售部    1    张三      退还     第二天
1006  G10 电脑    销售部    1    张三      领取     第二天问题:
我想用这仅有的一张表写出SQL得到目前销售部当前应该是在使用G3,G9,G10的数据。并且统计为三台。因为这个数据还会一直往下走,销售部还会不停的退还电脑领取电脑,而且有可能为退一台领两台或退两台领一台的可能。那么我想用这条SQL查询不管什么时候都会是当前销售部里边正在使用的电脑编码以及台数。在线等答案,谢谢各位了。

解决方案 »

  1.   


    select num
    from 
    (select num,(case status when '退还' then -1 when '领取' then 1 end)  status from [A]
     union all
     select 'G1', 1  union all  select 'G2', 1 union all select 'G3', 1) t
    group by num
    having sum(status)>0
      

  2.   

    select num
    from 
    (select num,(case status when '退还' then -1 when '领取' then 1 end)  status from [A]
     union all
     select 'G1', 1  union all  select 'G2', 1 union all select 'G3', 1) t
    group by num
    having sum(status)>1
      

  3.   


    select
      num,name,dept,sum(case when status = '退还' then -amount else amount end) as amount
    from (
        select 'G1' as num,'电脑' as name,'销售部' as dept,1 as amount,'领取' as status
        union
        select 'G2' as num,'电脑' as name,'销售部' as dept,1 as amount,'领取' as status
        union
        select 'G3' as num,'电脑' as name,'销售部' as dept,1 as amount,'领取' as status
        union
        select 'G1' as num,'电脑' as name,'销售部' as dept,1 as amount,'退还' as status
        union
        select 'G2' as num,'电脑' as name,'销售部' as dept,1 as amount,'退还' as status
        union
        select 'G8' as num,'电脑' as name,'销售部' as dept,1 as amount,'领取' as status
        union
        select 'G9' as num,'电脑' as name,'销售部' as dept,1 as amount,'领取' as status
        union
        select 'G8' as num,'电脑' as name,'销售部' as dept,1 as amount,'退还' as status
        union
        select 'G10' as num,'电脑' as name,'销售部' as dept,1 as amount,'领取' as status
      ) A
    group by num,name,dept
    having sum(case when status = '退还' then -amount else amount end) > 0
      

  4.   

    感谢楼上的四位朋友给出的答案。但是G1,G2,G3都为num这个字段,而num这个字段会包含很多G5,G6,G7,G9.................我想要的结果是一条SQL语句可以查询出不管num里边是什么情况,只保留这个部门当前在使用的电脑条数的明细数据以及多少台的sum.被退还的不记录在内.只要这个部门正在使用的.不管退还或领取多少次多少台.楼上这位朋友能够写完吗?我好试试,谢谢咯
      

  5.   

    表中 amount 列是始终为 1,还是可以大于 1 ?dept 始终为“销售部”,还是有其他部门?
    “当前使用的”指的是今天(getdate())吗?times 列怎么会是“今天”、“第二天”(这个是预测的)?请提供具有一般性和代表性的数据样本。
      

  6.   

    表amount为数量字段,始终为1。dept可以是任意部门且肯定是包含的所有部门的。当前使用的今天第二天都为模拟数据,实际上代表的是times这个字段,取的是当前领取或退还的每次的时间。
      

  7.   


    -- id 是按时间顺序从小到大
    if OBJECT_ID('tempdb..#') is not null
     drop table #;
    go
    create table # 
    (id int,num char(4),uname varchar(20),status varchar(10));
    insert into #
     select 1,'G1','YuanYou','borrow' union all
     select 2,'G2','YuanYou','borrow' union all
     select 3,'G3','YuanYou','borrow' union all
     select 1001,'G1','ZhangSan','return' union all
     select 1002,'G2','ZhangSan','return' union all
     select 1003,'G8','ZhangSan','borrow' union all
     select 1004,'G9','ZhangSan','borrow' union all
     select 1005,'G8','ZhangSan','return' union all
     select 1006,'G10','ZhangSan','borrow';set nocount on;
    select * from # where id in (
    select MAX(id) from (
    select id,num,(case status when 'return' then -1 when 'borrow' then 1 end) status from #
    ) t
    group by num having SUM(status)>0
    );
    select @@ROWCOUNT [SUM];
    /*
    id          num  uname                status
    ----------- ---- -------------------- ----------
    3           G3   YuanYou              borrow
    1004        G9   ZhangSan             borrow
    1006        G10  ZhangSan             borrowSUM
    -----------
    3
    */