有表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查询不管什么时候都会是当前销售部里边正在使用的电脑编码以及台数。在线等答案,谢谢各位了。
现状: 销售部有电脑三台,分别为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查询不管什么时候都会是当前销售部里边正在使用的电脑编码以及台数。在线等答案,谢谢各位了。
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
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
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
“当前使用的”指的是今天(getdate())吗?times 列怎么会是“今天”、“第二天”(这个是预测的)?请提供具有一般性和代表性的数据样本。
-- 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
*/