求SQL算法!!!(100分)

  • 主题发起人 主题发起人 leo2002
  • 开始时间 开始时间
L

leo2002

Unregistered / Unconfirmed
GUEST, unregistred user!
现有数据结构如下:
a1,a2,a3,b1,b2,b3,c1,c2,c3均为整数型。其中关系如下:
a1为单价1,a2为单价2,a3为单价3
b1为数量1,b2为数量2,b3为数量3
c1,c2,c3为代码,假设c1为10,即表示将a1与b1的乘积放到代码为10的项目上。
现假设数据如下:(连续两个逗号表示无数据)
a1,a2,a3,b1,b2,b3,c1,c2,c3
1,2,3,1,1,1,,3,
1,2,3,1,1,1,,,3
1,2,3,1,1,1,3,2,1

请求:
如果上面c1,c2,c3字段的值不为空或为零,即将对应的aX与bX的乘积相加求和。如上例应为:
第一行:c2不为零,所以有:a2*b2=2
第二行:c3不为零,所以有:a3*b3=3
第三行:c1,c2,c3均不为零,所以有a1*a2+a2*b2+a3*b3=6
最后结果为11。


我想要的是:能求出上述结果的sql算法。
我的算法如下,但不能成功:
SELECT sum((c1>0)*a1*b1+(c2>0)*a2*b2+(c3>0)*a3*b3) FROM 表1;
不过只是计算特定代号的时候可以通过:
如:SELECT sum((c1=8)*a1*b1+(c2=8)*a2*b2+(c3=8)*a3*b3) FROM 表1;

恳请高手指点!(分不够可以再加!)

 
用存贮过程和游标,很简单.
 
To leo2002,你的意思是不是当cx为空值时不能成功,
如果是这样的话,可以试试:
SELECT sum((isnull(c1,0)>0)*a1*b1+(isnull(c2,0)>0)*a2*b2+(isnull(c3,0)>0)*a3*b3) FROM 表1;
 
to house_txw:
首先谢谢你回答我的问题!我试过了你的方法,但会返回一个“用于函数的参数个数不对”的错误,真奇怪!我想你的思路是可行的,但不知如何解决这个语法嵌套的问题。

我想这个问题的突破点就在于是否能正确处理值为“空”的数据。
笨办法,二两步走:先将空字段填零,再按常规处理。
或者数据库里设定为拒绝空值。
 
house_txw用的函数isnull就是来正确处理空值的数据。
isnull需要数据库的支持,还有,>0的判断也需要数据库的支持。
特定的数据库有特定的函数名称和用法。
 
to armyjiang & house_txw & tangzwei:

非常感谢你们的帮助,我在你们的提醒下已经得出算法。希望指正,算法如下:
SELECT sum((Not isnull([c1]))*[a1]*[b1]+(Not isnull([c2]))*[a2]*[b2]+(Not isnull([c3]))*[a3]*[b3])
FROM 表1;

另to house_txw:
在access中,由于它自带有isnull函数,所以与Transact-SQL中的函数发生冲突,当然是自带函数优先了。你的答案我想是正确的,只是不适用于access数据库。
 
在oracle 数据库中可用
select
sum(decode(c1,null,0,0,0,1)*a1*b1
  +decode(c2,null,0,0,0,1)*a2*b2
  +decode(c3,null,0,0,0,1)*a3*b3) sum
from exa1
在sql 2000中可用
select
sum(isnull(c1,null,0,1)*a1*b1
  +isnull(c2,null,0,1)*a2*b2
  +isnull(c3,null,0,1)*a3*b3) sum
from exa1
//decode(c1,null,0,0,0,1) 表示
if c1=null then return 0
else if c1=0 then return 0
else return 1;
同样 isnull(c1,null,1)功能同decode(c1,null,0,0,0,1)
所以Leo2002这个问题可以终结了 [:)]
 
谢谢各位的帮忙,请查收你们的加分!
 
imking, 的总结很好,大致的思路就是这样,对特定的数据库做些相应的修改即可,
具体情况查一下help啦。

to leo2002,在想帮你的时候,我也得到了帮助~~谢谢DFW吧。
 
后退
顶部