求一算法sql

A6215911123 2008-10-29 04:47:49

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = object_ID(N'[dbo].[#test]') and OBJECTPROPERTY(ID, N'IsUserTABLE') = 1)
DROP TABLE [dbo].[#test]

CREATE TABLE [dbo].[#test] ([id] [bigint] IDENTITY (1, 1) NOT NULL ,
[n_Qty] [decimal](18, 4) NULL ,
[n_Qty_Out] [decimal](18, 4) NULL
) ON [PRIMARY]

INSERT INTO #test( n_qty )
SELECT 20 UNION ALL
SELECT -2 UNION ALL
SELECT -10 UNION ALL
SELECT 15 UNION ALL
SELECT -20

SELECT * from #test
go

DROP TABLE #test

(所影响的行数为 5 行)

id n_Qty n_Qty_Out
-------------------- -------------------- --------------------
1 20.0000 NULL
2 -2.0000 NULL
3 -10.0000 NULL
4 15.0000 NULL
5 -20.0000 NULL

(所影响的行数为 5 行)

求一sql,最后结果是

id n_Qty n_Qty_Out
-------------------- -------------------- --------------------
1 20.0000 20
2 -2.0000 NULL
3 -10.0000 NULL
4 15.0000 12
5 -20.0000 NULL

先进先出的,假如只有前2条的话,第一条的n_qty_out = 2,前4条的话,第一条的n_qty_out = 12, 第四条的n_qty_out = 0
...全文
149 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-10-29
  • 打赏
  • 举报
回复
结了..
A6215911123 2008-10-29
  • 打赏
  • 举报
回复
谢谢各位热心的朋友! :)
结贴了
liangCK 2008-10-29
  • 打赏
  • 举报
回复
唉..学海爷的..
liangCK 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dobear_0922 的回复:]
小梁子真够热心的,赞一个!
[/Quote]

5555
可惜都错..晕..还得学习学习才行..
Yang_ 2008-10-29
  • 打赏
  • 举报
回复
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = object_ID(N'[dbo].[#test]') and OBJECTPROPERTY(ID, N'IsUserTABLE') = 1)
DROP TABLE [dbo].[#test]

CREATE TABLE [dbo].[#test] ([id] [bigint] IDENTITY (1, 1) NOT NULL ,
[n_Qty] [decimal](18, 4) NULL ,
[n_Qty_Out] [decimal](18, 4) NULL
) ON [PRIMARY]

INSERT INTO #test( n_qty )
SELECT 20 UNION ALL
SELECT -2 UNION ALL
SELECT -10 UNION ALL
SELECT 15 UNION ALL
SELECT -20
--添多几条数据
UNION ALL
SELECT 10
UNION ALL
SELECT -5
UNION ALL
SELECT 10



declare @qty_out [decimal](18, 4)

select @qty_out=SUM(n_Qty)
from #test
where n_Qty<0

declare @tempqty [decimal](18, 4)
declare @tempqty1 [decimal](18, 4)

update a set
@tempqty=(select SUM(n_Qty) from #test where n_Qty>0 and id<= a.id),
@tempqty1=isnull((select SUM(n_Qty) from #test where n_Qty>0 and id< a.id),0),
[n_Qty_Out]=case when @tempqty+@qty_out<=0 then a.n_Qty
when @tempqty1+@qty_out<=0 then -(@tempqty1+@qty_out)
else null
end
from [#test] a
where a.n_Qty >0


SELECT * from #test
go

DROP TABLE #test


--结果

id n_Qty n_Qty_Out
-------------------- --------------------------------------- ---------------------------------------
1 20.0000 20.0000
2 -2.0000 NULL
3 -10.0000 NULL
4 15.0000 15.0000
5 -20.0000 NULL
6 10.0000 2.0000
7 -5.0000 NULL
8 10.0000 NULL

(8 行受影响)
dobear_0922 2008-10-29
  • 打赏
  • 举报
回复
小梁子真够热心的,赞一个!
Yang_ 2008-10-29
  • 打赏
  • 举报
回复
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = object_ID(N'[dbo].[#test]') and OBJECTPROPERTY(ID, N'IsUserTABLE') = 1)
DROP TABLE [dbo].[#test]

CREATE TABLE [dbo].[#test] ([id] [bigint] IDENTITY (1, 1) NOT NULL ,
[n_Qty] [decimal](18, 4) NULL ,
[n_Qty_Out] [decimal](18, 4) NULL
) ON [PRIMARY]

INSERT INTO #test( n_qty )
SELECT 20 UNION ALL
SELECT -2 UNION ALL
SELECT -10 UNION ALL
SELECT 15 UNION ALL
SELECT -20

declare @qty_out [decimal](18, 4)

select @qty_out=SUM(n_Qty)
from #test
where n_Qty<0

declare @tempqty [decimal](18, 4)
declare @tempqty1 [decimal](18, 4)

update a set
@tempqty=(select SUM(n_Qty) from #test where n_Qty>0 and id<= a.id),
@tempqty1=isnull((select SUM(n_Qty) from #test where n_Qty>0 and id< a.id),0),
[n_Qty_Out]=case when @tempqty+@qty_out<=0 then a.n_Qty
when @tempqty1+@qty_out<=0 then -(@tempqty1+@qty_out)
else null
end
from [#test] a
where a.n_Qty >0


SELECT * from #test
go

DROP TABLE #test

--结果
id n_Qty n_Qty_Out
-------------------- --------------------------------------- ---------------------------------------
1 20.0000 20.0000
2 -2.0000 NULL
3 -10.0000 NULL
4 15.0000 12.0000
5 -20.0000 NULL

(5 行受影响)
liangCK 2008-10-29
  • 打赏
  • 举报
回复
这样没问题了吧?

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = object_ID(N'[dbo].[#test]') and OBJECTPROPERTY(ID, N'IsUserTABLE') = 1)
DROP TABLE [dbo].[#test]

CREATE TABLE [dbo].[#test] ([id] [bigint] IDENTITY (1, 1) NOT NULL ,
[n_Qty] [decimal](18, 4) NULL ,
[n_Qty_Out] [decimal](18, 4) NULL
) ON [PRIMARY]

INSERT INTO #test( n_qty )
SELECT 20 UNION ALL
SELECT -10 UNION ALL
SELECT -10 UNION ALL
SELECT 15 UNION ALL
SELECT -20

SELECT id,n_Qty,
out_Qty=CASE WHEN n_Qty<=0
THEN NULL
ELSE
CASE WHEN n_Qty>=ABS((SELECT SUM(n_qty)
FROM #test
WHERE id<=a.id
AND id>=(SELECT TOP 1 id
FROM #test
WHERE id<a.id
AND n_Qty>0
ORDER BY id DESC)))
THEN ABS((SELECT SUM(n_qty)
FROM #test
WHERE id<=a.id
AND id>=(SELECT TOP 1 id
FROM #test
WHERE id<a.id
AND n_Qty>0
ORDER BY id DESC)))
ELSE n_Qty
END
END
FROM #test AS a

/*
id n_Qty out_Qty
-------------------- --------------------------------------- ---------------------------------------
1 20.0000 20.0000
2 -10.0000 NULL
3 -10.0000 NULL
4 15.0000 15.0000
5 -20.0000 NULL

(5 行受影响)
*/
liangCK 2008-10-29
  • 打赏
  • 举报
回复
也错了..
liangCK 2008-10-29
  • 打赏
  • 举报
回复
--这样呢?

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = object_ID(N'[dbo].[#test]') and OBJECTPROPERTY(ID, N'IsUserTABLE') = 1)
DROP TABLE [dbo].[#test]

CREATE TABLE [dbo].[#test] ([id] [bigint] IDENTITY (1, 1) NOT NULL ,
[n_Qty] [decimal](18, 4) NULL ,
[n_Qty_Out] [decimal](18, 4) NULL
) ON [PRIMARY]

INSERT INTO #test( n_qty )
SELECT 20 UNION ALL
SELECT -2 UNION ALL
SELECT -10 UNION ALL
SELECT 15 UNION ALL
SELECT -20

SELECT id,n_Qty,
out_Qty=CASE WHEN n_Qty<=0
THEN NULL
ELSE
CASE WHEN n_Qty>=(SELECT SUM(n_qty)
FROM #test
WHERE id<=a.id
AND id>(SELECT TOP 1 id
FROM #test
WHERE id<a.id
AND n_Qty>0
ORDER BY id DESC))
THEN ABS((SELECT SUM(n_qty)
FROM #test
WHERE id<a.id
AND id>(SELECT TOP 1 id
FROM #test
WHERE id<a.id
AND n_Qty>0
ORDER BY id DESC)))
ELSE n_Qty
END
END
FROM #test AS a

/*
id n_Qty out_Qty
-------------------- --------------------------------------- ---------------------------------------
1 20.0000 20.0000
2 -2.0000 NULL
3 -10.0000 NULL
4 15.0000 12.0000
5 -20.0000 NULL

(5 行受影响)
*/
A6215911123 2008-10-29
  • 打赏
  • 举报
回复
呵呵 猛
liangCK 2008-10-29
  • 打赏
  • 举报
回复
哦..错了..
liangCK 2008-10-29
  • 打赏
  • 举报
回复
--这样子吗?

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE ID = object_ID(N'[dbo].[#test]') and OBJECTPROPERTY(ID, N'IsUserTABLE') = 1)
DROP TABLE [dbo].[#test]

CREATE TABLE [dbo].[#test] ([id] [bigint] IDENTITY (1, 1) NOT NULL ,
[n_Qty] [decimal](18, 4) NULL ,
[n_Qty_Out] [decimal](18, 4) NULL
) ON [PRIMARY]

INSERT INTO #test( n_qty )
SELECT 20 UNION ALL
SELECT -2 UNION ALL
SELECT -10 UNION ALL
SELECT 15 UNION ALL
SELECT -20

SELECT id,n_Qty,
out_Qty=CASE WHEN n_Qty<=0
THEN NULL
ELSE
CASE WHEN n_Qty>=(SELECT SUM(n_qty)
FROM #test
WHERE id<=a.id
AND id>=(SELECT TOP 1 id
FROM #test
WHERE id<a.id
AND n_Qty>0
ORDER BY id DESC))
THEN (SELECT SUM(n_qty)
FROM #test
WHERE id<=a.id
AND id>=(SELECT TOP 1 id
FROM #test
WHERE id<a.id
AND n_Qty>0
ORDER BY id DESC))
ELSE n_Qty
END
END
FROM #test AS a

/*
id n_Qty out_Qty
-------------------- --------------------------------------- ---------------------------------------
1 20.0000 20.0000
2 -2.0000 NULL
3 -10.0000 NULL
4 15.0000 15.0000
5 -20.0000 NULL

(5 行受影响)
*/
fcuandy 2008-10-29
  • 打赏
  • 举报
回复
OK
ws_hgo 2008-10-29
  • 打赏
  • 举报
回复
我先看下
A6215911123 2008-10-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fcuandy 的回复:]
2,3,5为什么是null,值不够 时就置null吗?
[/Quote]

2,3,5是减量,不需要计算。
n_Qty_Out是统计该批次上减掉了多少货物
fcuandy 2008-10-29
  • 打赏
  • 举报
回复
那边是二表,你是一表,其实把正负分开,就是一样的题了。
fcuandy 2008-10-29
  • 打赏
  • 举报
回复
本质与此相同

http://topic.csdn.net/u/20081028/14/842b135f-c004-40b1-b60d-625722bbf4b3.html

只是具体的数据计算方式上略有区别。

楼主只需说明数据如何处理即可。
fcuandy 2008-10-29
  • 打赏
  • 举报
回复
2,3,5为什么是null,值不够 时就置null吗?

22,209

社区成员

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

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