求一条 处理效率高的 多级查询 且带运算的 sql语句解决办法
求一条 处理效率高的 多级查询 且带运算的 sql语句
虚拟表(kk) 1.
select cd1.cInvcode, sum(cd1.iquantity) as SumNum
from inventory cd0,currentstock cd1 where cd1.cInvcode = cd0.cInvcode
group by cd1.cInvcode
通过以上语句 得到 虚拟表(若命名别名为:kk) 中
kk.cInvCode, kk.SumNum 这两个字段的内容
表2. 表 Inventory(别名为In) 中 的字段有 cInvCode, iTopSum(上限数量), iLowSum(下限数量),cInvName
要求:
首先 当 虚拟表kk 和 表 Inventory 中的 (In.cInvCode=kk.cInvCode)字段相等时对应的记录的.
然后 在对应记录上 比较 In.iTopSum < kk.SumNum < In.iLowSum (kk.SumNum 值在In.iTopSum 和 In.iLowSum 范围之外)
如果 kk.SumNum > In.iTopSum 求出(kk.SumNum - In.iTopSum)差值.
如果 kk.SumNum < In.iLowSum 求出(In.iLowSum - kk.SumNum)差值.
最后得到显示表的结果是:
表的字段有: | cInvCode | cInvName | SumNum | iTopSum | iLowSum |
能不能通过 sql语句实现呢?
------解决方案--------------------
使用case when语句就可以,写个demo你看看修改一下就可以了
--测试数据
create table temp( cname varchar2(100),SumNum int,iTopSum int, iLowSum int )
insert into temp
select '12 ',50,100,30 from dual union all
select '1 ',150,100,30 from dual union all
select '2 ',20,100,30 from dual;
--执行查询
select cname,
case when SumNum > iTopSum then SumNum - iTopSum
when SumNum < iLowSum then iLowSum - SumNum
else SumNum
end SumNum
from temp;
--查询结果
12 50
1 50
2 10
虚拟表(kk) 1.
select cd1.cInvcode, sum(cd1.iquantity) as SumNum
from inventory cd0,currentstock cd1 where cd1.cInvcode = cd0.cInvcode
group by cd1.cInvcode
通过以上语句 得到 虚拟表(若命名别名为:kk) 中
kk.cInvCode, kk.SumNum 这两个字段的内容
表2. 表 Inventory(别名为In) 中 的字段有 cInvCode, iTopSum(上限数量), iLowSum(下限数量),cInvName
要求:
首先 当 虚拟表kk 和 表 Inventory 中的 (In.cInvCode=kk.cInvCode)字段相等时对应的记录的.
然后 在对应记录上 比较 In.iTopSum < kk.SumNum < In.iLowSum (kk.SumNum 值在In.iTopSum 和 In.iLowSum 范围之外)
如果 kk.SumNum > In.iTopSum 求出(kk.SumNum - In.iTopSum)差值.
如果 kk.SumNum < In.iLowSum 求出(In.iLowSum - kk.SumNum)差值.
最后得到显示表的结果是:
表的字段有: | cInvCode | cInvName | SumNum | iTopSum | iLowSum |
能不能通过 sql语句实现呢?
------解决方案--------------------
使用case when语句就可以,写个demo你看看修改一下就可以了
--测试数据
create table temp( cname varchar2(100),SumNum int,iTopSum int, iLowSum int )
insert into temp
select '12 ',50,100,30 from dual union all
select '1 ',150,100,30 from dual union all
select '2 ',20,100,30 from dual;
--执行查询
select cname,
case when SumNum > iTopSum then SumNum - iTopSum
when SumNum < iLowSum then iLowSum - SumNum
else SumNum
end SumNum
from temp;
--查询结果
12 50
1 50
2 10