请教,有高难度数据转换格式问题

sankyqiu 2009-03-21 09:08:04
请教,有高难度数据转换格式问题
仓库 日期 单号 货品 单位 期初 收入 发出 结存
半成品仓 2009-03-01 期初 16081D 个 300 0 0 0
半成品仓 2009-03-01 090301001 16081D 个 0 50 0 0
半成品仓 2009-03-02 090301002 16081D 个 0 0 30 0
半成品仓 2009-03-15 090315003 16081D 个 0 20 0 0

要求计算结果如下显示 (计算每天的期初和结存)
本日结存作为明天的期初,如此累推.

仓库 日期 单号 货品 单位 期初 收入 发出 结存
半成品仓 2009-03-01 期初 16081D 个 300 0 0 300
半成品仓 2009-03-01 090301001 16081D 个 300 50 0 350
半成品仓 2009-03-02 090301002 16081D 个 350 0 30 320
半成品仓 2009-03-15 090315003 16081D 个 320 13 0 333
...全文
73 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sankyqiu 2009-03-21
  • 打赏
  • 举报
回复
如果同一天有多个单据收入或发出时如何处理?

仓库 日期 单号 货品 单位 期初 收入 发出 结存
半成品仓 2009-03-01 期初 16081D 个 300 0 0 0
半成品仓 2009-03-01 090301001 16081D 个 0 50 0 0
半成品仓 2009-03-01 S090301002 16081D 个 0 15 0 0
半成品仓 2009-03-01 A090301003 16081D 个 0 0 20 0
半成品仓 2009-03-01 K90301004 16081D 个 0 0 10 0
半成品仓 2009-03-02 090301002 16081D 个 0 0 30 0
半成品仓 2009-03-15 090315003 16081D 个 0 20 0 0

这样能不能算出来呀?谢谢!!
sankyqiu 2009-03-21
  • 打赏
  • 举报
回复
困难解决了,谢谢各位的帮忙!
htl258_Tony 2009-03-21
  • 打赏
  • 举报
回复
declare @t table(仓库 varchar(10),日期 datetime,   单号 varchar(10),  货品 varchar(10), 单位 varchar(10), 期初 int,  收入 int, 发出 int, 结存 int)
insert @t select '半成品仓','2009-3-1','期初','16081D','个',300,0,0,0
insert @t select '半成品仓','2009-3-1',90301001,'16081D','个',0,50,0,0
insert @t select '半成品仓','2009-3-2',90301002,'16081D','个',0,0,30,0
insert @t select '半成品仓','2009-3-15',90315003,'16081D','个',0,20,0,0

update @t set
期初=(select sum(期初+收入-发出) from @t where case when 单号='期初' then 0 else 单号 end <= case when t.单号='期初' then 0 else t.单号 end)-收入+发出,
结存=(select sum(期初+收入-发出) from @t where case when 单号='期初' then 0 else 单号 end <= case when t.单号='期初' then 0 else t.单号 end)
from @t t

select * from @t

仓库 日期 单号 货品 单位 期初 收入 发出 结存
---------- ----------------------- ---------- ---------- ---------- ----------- ----------- ----------- -----------
半成品仓 2009-03-01 00:00:00.000 期初 16081D 个 300 0 0 300
半成品仓 2009-03-01 00:00:00.000 90301001 16081D 个 300 50 0 350
半成品仓 2009-03-02 00:00:00.000 90301002 16081D 个 350 0 30 320
半成品仓 2009-03-15 00:00:00.000 90315003 16081D 个 320 20 0 340

(4 行受影响)
不好意思,发看到你的期初,更改一下.
liangCK 2009-03-21
  • 打赏
  • 举报
回复
---------------------------------
-- Author: liangCK 小梁
---------------------------------

--> 生成测试数据: @T
DECLARE @T TABLE (仓库 VARCHAR(8),日期 DATETIME,单号 VARCHAR(9),货品 VARCHAR(6),单位 VARCHAR(2),期初 INT,收入 INT,发出 INT,结存 INT)
INSERT INTO @T
SELECT '半成品仓','2009-03-01','期初','16081D','个',300,0,0,0 UNION ALL
SELECT '半成品仓','2009-03-01','090301001','16081D','个',0,50,0,0 UNION ALL
SELECT '半成品仓','2009-03-02','090301002','16081D','个',0,0,30,0 UNION ALL
SELECT '半成品仓','2009-03-15','090315003','16081D','个',0,20,0,0

--SQL查询如下:

DECLARE @IS_期初 BIT
DECLARE @期初 INT,@结存 INT;
SELECT @期初=0,@结存=0

UPDATE @T SET
@期初=CASE WHEN 单号='期初' THEN 期初
ELSE @结存 END,
@结存=CASE WHEN 单号='期初' THEN @期初
ELSE @期初+收入-发出 END,
期初=@期初,
结存=@结存

SELECT * FROM @T

/*
仓库 日期 单号 货品 单位 期初 收入 发出 结存
-------- ----------------------- --------- ------ ---- ----------- ----------- ----------- -----------
半成品仓 2009-03-01 00:00:00.000 期初 16081D 个 300 0 0 300
半成品仓 2009-03-01 00:00:00.000 090301001 16081D 个 300 50 0 350
半成品仓 2009-03-02 00:00:00.000 090301002 16081D 个 350 0 30 320
半成品仓 2009-03-15 00:00:00.000 090315003 16081D 个 320 20 0 340

(4 行受影响)

*/
htl258_Tony 2009-03-21
  • 打赏
  • 举报
回复
declare @t table(仓库 varchar(10),日期 datetime,   单号 varchar(10),  货品 varchar(10), 单位 varchar(10), 期初 int,  收入 int, 发出 int, 结存 int)
insert @t select '半成品仓','2009-3-1','期初','16081D','个',300,0,0,0
insert @t select '半成品仓','2009-3-1',90301001,'16081D','个',0,50,0,0
insert @t select '半成品仓','2009-3-2',90301002,'16081D','个',0,0,30,0
insert @t select '半成品仓','2009-3-15',90315003,'16081D','个',0,20,0,0

update @t set 结存=(select
sum(期初+收入-发出) from @t where case when 单号='期初' then 0 else 单号 end <= case when t.单号='期初' then 0 else t.单号 end)
from @t t

select * from @t

仓库 日期 单号 货品 单位 期初 收入 发出 结存
---------- ----------------------- ---------- ---------- ---------- ----------- ----------- ----------- -----------
半成品仓 2009-03-01 00:00:00.000 期初 16081D 个 300 0 0 300
半成品仓 2009-03-01 00:00:00.000 90301001 16081D 个 0 50 0 350
半成品仓 2009-03-02 00:00:00.000 90301002 16081D 个 0 0 30 320
半成品仓 2009-03-15 00:00:00.000 90315003 16081D 个 0 20 0 340

(4 行受影响)
htl258_Tony 2009-03-21
  • 打赏
  • 举报
回复
你的结果跟你过程好像匹配不上.
liangCK 2009-03-21
  • 打赏
  • 举报
回复
你要的结果是:

---------------------------------
-- Author: liangCK 小梁
---------------------------------

--> 生成测试数据: @T
DECLARE @T TABLE (仓库 VARCHAR(8),日期 DATETIME,单号 VARCHAR(10),货品 VARCHAR(6),单位 VARCHAR(2),期初 INT,收入 INT,发出 INT,结存 INT)
INSERT INTO @T
SELECT '半成品仓','2009-03-01','期初','16081D','个',300,0,0,0 UNION ALL
SELECT '半成品仓','2009-03-01','090301001','16081D','个',0,50,0,0 UNION ALL
SELECT '半成品仓','2009-03-01','S090301002','16081D','个',0,15,0,0 UNION ALL
SELECT '半成品仓','2009-03-01','A090301003','16081D','个',0,0,20,0 UNION ALL
SELECT '半成品仓','2009-03-01','K90301004','16081D','个',0,0,10,0 UNION ALL
SELECT '半成品仓','2009-03-02','090301002','16081D','个',0,0,30,0 UNION ALL
SELECT '半成品仓','2009-03-15','090315003','16081D','个',0,20,0,0

--SQL查询如下:

DECLARE @IS_期初 BIT
DECLARE @期初 INT,@结存 INT;
SELECT @期初=0,@结存=0

UPDATE @T SET
@期初=CASE WHEN 单号='期初' THEN 期初
ELSE @结存 END,
@结存=CASE WHEN 单号='期初' THEN @期初
ELSE @期初+收入-发出 END,
期初=@期初,
结存=@结存

SELECT * FROM @T

/*
仓库 日期 单号 货品 单位 期初 收入 发出 结存
-------- ----------------------- ---------- ------ ---- ----------- ----------- ----------- -----------
半成品仓 2009-03-01 00:00:00.000 期初 16081D 个 300 0 0 300
半成品仓 2009-03-01 00:00:00.000 090301001 16081D 个 300 50 0 350
半成品仓 2009-03-01 00:00:00.000 S090301002 16081D 个 350 15 0 365
半成品仓 2009-03-01 00:00:00.000 A090301003 16081D 个 365 0 20 345
半成品仓 2009-03-01 00:00:00.000 K90301004 16081D 个 345 0 10 335
半成品仓 2009-03-02 00:00:00.000 090301002 16081D 个 335 0 30 305
半成品仓 2009-03-15 00:00:00.000 090315003 16081D 个 305 20 0 325

(7 行受影响)

*/

22,211

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧