请教SQL语句,急~~~~~~,请给予帮助,谢谢!!!!!

acnode 2004-09-14 11:20:24
有一个表如下:
仓号 型号 数量1 数量2 数量3 数量4
01 50218 100 50 5 85
01 50224 50 60
01 50236 100 5 95
。。。。。。
现在想根据数量1的值统计出数量2 数量3 数量4所能分配的值的大小
(数量2+数量3+数量4)的和必须等于数量1
比如,上面的数据统计结果如
仓号 型号 数量1 数量2 数量3 数量4
01 50218 100 50 5 45
01 50224 50 50
01 50236 100 5 95
.......
...全文
232 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
acnode 2004-09-15
  • 打赏
  • 举报
回复
谢谢各位了,问题解决了。结贴
acnode 2004-09-14
  • 打赏
  • 举报
回复
数量2+数量3+数量4的值肯定是大于等于数量1的
马前小卒 2004-09-14
  • 打赏
  • 举报
回复
up
cxingh 2004-09-14
  • 打赏
  • 举报
回复
不明白
如果 你例子中第二条记录中数量3的值为小于50的数呢? 怎么分配啊?
acnode 2004-09-14
  • 打赏
  • 举报
回复
不好意思,我补充一下题目。
分配的原则是以(数量2+数量3+数量4)=数量1的值作依据来分配.
如果数量1〈数量2,那么数量2就用数量1来替换,数量3和数量4的值替换为0
如果数量2<数量1<(数量2+数量3) 那么数量2还是数量2自身的值,数量3=数量1-数量2,数量4的值替换为零
数量(数量2+数量3)<数量1<(数量2+数量3+数量4),那么数量2和数量3是自身的值,数量4的值为
数量1-数量2-数量3

KLAN举的例子分配的结果就是数量2是10,数量3是零.

tmkwind 2004-09-14
  • 打赏
  • 举报
回复
没有看明白
chinaandys 2004-09-14
  • 打赏
  • 举报
回复
听不明
klan 2004-09-14
  • 打赏
  • 举报
回复
问题不明确。

如果我的数量1是10,数量2是20,数量3是40,那应该怎么分?
zjcxc 元老 2004-09-14
  • 打赏
  • 举报
回复
--示例

--示例数据
create table tb(仓号 varchar(10),型号 varchar(10),数量1 int,数量2 int,数量3 int,数量4 int)
insert tb select '01','50218',100,50,5 ,85
union all select '01','50224',50 ,0 ,0 ,60
union all select '01','50236',100,5 ,95,0
go

--查询
select 仓号,型号,数量1
,数量2=case
when isnull(数量1,0)<=isnull(数量2,0)
then 数量1
else 数量2 end
,数量3=case
when isnull(数量1,0)<=isnull(数量2,0)
then 0
when isnull(数量1,0)<=isnull(数量2,0)+isnull(数量3,0)
then isnull(数量1,0)-isnull(数量2,0)
else 数量3 end
,数量4=case
when isnull(数量1,0)<=isnull(数量2,0)+isnull(数量3,0)
then 0
when isnull(数量1,0)<=isnull(数量2,0)+isnull(数量3,0)+isnull(数量4,0)
then isnull(数量1,0)-isnull(数量2,0)-isnull(数量3,0)
else 数量4 end
from tb

go

--删除测试
drop table tb

/*--测试结果

仓号 型号 数量1 数量2 数量3 数量4
---------- ---------- ----------- ----------- ----------- -----------
01 50218 100 50 5 45
01 50224 50 0 0 50
01 50236 100 5 95 0

(所影响的行数为 3 行)
--*/
xxora 2004-09-14
  • 打赏
  • 举报
回复
DECLARE @COLUMNS5 VARCHAR(3)
DECLARE @COLUMNS6 VARCHAR(20)
DECLARE @COLUMNS1 NUMERIC(4)
DECLARE @COLUMNS2 NUMERIC(4)
DECLARE @COLUMNS3 NUMERIC(4)
DECLARE @COLUMNS4 NUMERIC(4)

DECLARE CUR_COLUMNS SCROLL CURSOR FOR
SELECT 仓号,型号,数量1,数量2,数量3,数量4 FROM TAB_1
OPEN CUR_COLUMNS
FETCH NEXT FROM CUR_COLUMNS INTO @COLUMNS5,@COLUMNS6,@COLUMNS1,@COLUMNS2,@COLUMNS3,@COLUMNS4
WHILE @@FETCH_STATUS=0
BEGIN
-- 如果数量1〈数量2,那么数量2就用数量1来替换,数量3和数量4的值替换为0
--补充:当数量1=数量2
IF @COLUMNS1<@COLUMNS2 OR @COLUMNS1=@COLUMNS2
BEGIN
SET @COLUMNS2=@COLUMNS1
SET @COLUMNS3=0
SET @COLUMNS4=0
END

-- 如果数量2<数量1<(数量2+数量3) 那么数量2还是数量2自身的值,数量3=数量1-数量2,数量4的值替换为零
ELSE IF @COLUMNS1>@COLUMNS2 AND @COLUMNS1<(@COLUMNS2+@COLUMNS3)
BEGIN
SET @COLUMNS3=@COLUMNS1-@COLUMNS2
SET @COLUMNS4=0
END

--如果(数量2+数量3)<数量1<(数量2+数量3+数量4),那么数量2和数量3是自身的值,数量4的值为数量1-数量2-数量3
ELSE IF @COLUMNS1>(@COLUMNS2+@COLUMNS3)AND @COLUMNS1<(@COLUMNS2+@COLUMNS3+@COLUMNS4)
BEGIN
SET @COLUMNS4=@COLUMNS1-@COLUMNS2-@COLUMNS3
END

UPDATE TAB_1 SET 数量1=@COLUMNS1,数量2=@COLUMNS2,数量3=@COLUMNS3,数量4=@COLUMNS4 FROM TAB_1 WHERE 仓号=@COLUMNS5 AND 型号=@COLUMNS6

SELECT * FROM TAB_1 WHERE 仓号=@COLUMNS5 AND 型号=@COLUMNS6

FETCH NEXT FROM CUR_COLUMNS INTO @COLUMNS5,@COLUMNS6,@COLUMNS1,@COLUMNS2,@COLUMNS3,@COLUMNS4

END

CLOSE CUR_COLUMNS
DEALLOCATE CUR_COLUMNS
pp_hotel 2004-09-14
  • 打赏
  • 举报
回复
对了 如果字段值为空就不行了 :p
pp_hotel 2004-09-14
  • 打赏
  • 举报
回复
select 仓号,型号,[数量 1],
[数量 2]=case when 数量2>数量1 then 数量1 else 数量2 end,
[数量 3]=case when 数量2>数量1 then 0 when (数量2+数量3)>数量1 then 数量1-数量2else 数量3 end,
[数量 4]=case when 数量2>数量1 then 0 when (数量2+数量3)>数量1 then 0 when (数量2+数量3+数量4)>数量1 then 数量1-数量2-数量3 else 0 end
from 你的表名

按照你补充的规则 写得很笨 见笑了

acnode 2004-09-14
  • 打赏
  • 举报
回复
没人理我呀,555555~~~~~

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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