高手不在吗?

azsoft 2003-12-06 09:30:34
declare @t1 table(cname varchar(2),sl int,ph varchar(10))
insert into @t1
select 'a',150,'010101'
union all select 'a',200,'020304'
union all select 'b',300,'040506'

declare @t2 table(cname varchar(2),sl int,ph varchar(10))
insert into @t2
select 'a',150,'020304'
union all select 'b',200,'040506'


--数据处理
declare @t table(cname varchar(2),sl int,ph varchar(10),sl1 int,sl2 int)
insert into @t(cname,ph,sl1,sl2)
select a.cname,a.ph,a.sl,b.sl
from @t1 a join @t2 b on a.cname=b.cname
order by a.cname

declare @cname varchar(2),@sl int,@s2 int
update @t set @sl=case cname when @cname then @s2 else sl2 end
,sl=case when @sl>sl1 then sl1 else @sl end
,@s2=@sl-sl1,@cname=cname

--显示处理结果
select cname,sl,ph from @t where sl>0
结果为:
cname sl ph
-------------------------
a 150 010101
b 200 040506

我想要的结果为:也就是 ph为(020304)的值不足时,在去减其他的ph的值
cname sl ph
-------------------------
a 150 020304
b 200 040506
...全文
51 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
azsoft 2003-12-06
  • 打赏
  • 举报
回复
谢谢 j9988(j9988) 老师 结帖
j9988 2003-12-06
  • 打赏
  • 举报
回复
order by a.cname,(case when A.ph=B.ph then 0 else 1 end)

我测试后,是这个结果啊。

1、如果@t2 表的ph=020304 的sl=250 时的结果为

cname sl ph
-----------------
a 200 020304
a 50 010101
b 200 040506

2、如果@t2 表的ph=020304 的sl=150 时的结果为
cname sl ph
-----------------
a 150 020304
b 200 040506
azsoft 2003-12-06
  • 打赏
  • 举报
回复
以下测试:
declare @t1 table(cname varchar(2),sl int,ph varchar(10))
insert into @t1
select 'a',150,'010101'
union all select 'a',200,'020304'
union all select 'b',300,'040506'

declare @t2 table(cname varchar(2),sl int,ph varchar(10))
insert into @t2
select 'a',150,'020304'
union all select 'b',200,'040506'


declare @t table(cname varchar(2),sl int,ph varchar(10),sl1 int,sl2 int)
insert into @t(cname,ph,sl1,sl2)
select a.cname,a.ph,a.sl,b.sl
from @t1 a join @t2 b on a.cname=b.cname
order by a.cname

declare @cname varchar(2),@sl int,@s2 int
update @t set @sl=case cname when @cname then @s2 else sl2 end
,sl=case when @sl>sl1 then sl1 else @sl end
,@s2=@sl-sl1,@cname=cname

select cname,sl,ph from @t where sl>0

要求的结果:

1、如果@t2 表的ph=020304 的sl=250 时的结果为

cname sl ph
-----------------
a 200 020304
a 50 010101
b 200 040506

2、如果@t2 表的ph=020304 的sl=150 时的结果为
cname sl ph
-----------------
a 150 020304
b 200 040506


j9988 2003-12-06
  • 打赏
  • 举报
回复
你执行试试

declare @t1 table(cname varchar(2),sl int,ph varchar(10))
insert into @t1
select 'a',150,'010101'
union all select 'a',200,'020304'
union all select 'b',300,'040506'

declare @t2 table(cname varchar(2),sl int,ph varchar(10))
insert into @t2
select 'a',250,'020304'
union all select 'b',200,'040506'


--数据处理
declare @t table(cname varchar(2),sl int,ph varchar(10),sl1 int,sl2 int)
insert into @t(cname,ph,sl1,sl2)
select a.cname,a.ph,a.sl,b.sl
from @t1 a join @t2 b on a.cname=b.cname
order by a.cname,(case when A.ph=B.ph then 0 else 1 end)
--就这儿改改。反正你要顺序UPDATE,你生成的@t也要按顺序。


declare @cname varchar(2),@sl int,@s2 int
update @t set @sl=case cname when @cname then @s2 else sl2 end
,sl=case when @sl>sl1 then sl1 else @sl end
,@s2=@sl-sl1,@cname=cname

--显示处理结果
select cname,sl,ph from @t where sl>0
azsoft 2003-12-06
  • 打赏
  • 举报
回复
也就是 ph为(020304)的值不足时,在去减其他的ph(010101)的值
减足为止
azsoft 2003-12-06
  • 打赏
  • 举报
回复
declare @t1 table(cname varchar(2),sl int,ph varchar(10))
insert into @t1
select 'a',150,'010101'
union all select 'a',200,'020304'
union all select 'b',300,'040506'

declare @t2 table(cname varchar(2),sl int,ph varchar(10))
insert into @t2
select 'a',250,'020304'
union all select 'b',200,'040506'


--数据处理
declare @t table(cname varchar(2),sl int,ph varchar(10),sl1 int,sl2 int)
insert into @t(cname,ph,sl1,sl2)
select a.cname,a.ph,a.sl,b.sl
from @t1 a join @t2 b on a.cname=b.cname
order by a.cname

declare @cname varchar(2),@sl int,@s2 int
update @t set @sl=case cname when @cname then @s2 else sl2 end
,sl=case when @sl>sl1 then sl1 else @sl end
,@s2=@sl-sl1,@cname=cname

--显示处理结果
select cname,sl,ph from @t where sl>0
结果为:
cname sl ph
-------------------------
a 150 010101
b 200 040506

我想要的结果为:也就是 ph为(020304)的值不足时,在去减其他的ph的值
cname sl ph
-------------------------
a 200 020304
a 50 010101
b 200 040506
j9988 2003-12-06
  • 打赏
  • 举报
回复
上面改改是可以了,但我总是理解不了你下面这一句
(盯了半天没明白,总怀疑有问题,因为@S1和@S2好象循环赋值了):
update @t set @sl=case cname when @cname then @s2 else sl2 end
,sl=case when @sl>sl1 then sl1 else @sl end
,@s2=@sl-sl1,@cname=cname
j9988 2003-12-06
  • 打赏
  • 举报
回复
declare @t table(cname varchar(2),sl int,ph varchar(10),sl1 int,sl2 int)
insert into @t(cname,ph,sl1,sl2)
select a.cname,a.ph,a.sl,b.sl
from @t1 a join @t2 b on a.cname=b.cname
order by a.cname,(case when A.ph=B.ph then 0 else 1 end)

34,874

社区成员

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

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