有N个商品,有四个指标,
name   criteria1    criteria2   criteria3  criteria4
----------------------------------------------------
货1     107         10            0.4       3
货2     306         8             0.2       7
货3     553          6            0.7       6
……
货N     644          7            0.5       9每一列的criteria属于一个指标,而criteria1占权重0.3,criteria2是0.4,criteria3是0.1,criteria4是0.2。
现在要将每列得出一个分别取和,然后用每列的N列数值去除各自列的和得到每个货物的在每个criteria下的归一值,然后四列的归一值分别乘以它们各自的权重,再求和,得到每个货品的最终的数值。如此将这个数值进行排序,利用C++语言中的循环语句来使得输出前几个货物名称,它们的数值相加大于20%(占总数的20%)。其实就是个求和排序再求和的过程,但是不知道其中的实现步骤,即
1)是可以利用现有的SQL server 2000里面的表格经过怎么样的设置,使得直接计算出一列然后传递到VC中的C++语言中去使用?
还是
2)直接利用VC中的编程输入计算语言,来得到输出结果?
请高手帮助
谢谢

解决方案 »

  1.   

    CREATE PROCEDURE cs as
    begin
    declare @s1 int,@s2 int ,@s3 int ,@s4 int,@minrate int
    select @s1=sum(criteria1),@s2=sum(criteria2),@s3=sum(criteria3),@s4=sum(criteria4) from tab
    select identity(int, 1,1) as id,name, total=criteria1/@s1*0.3+criteria2/@s2*0.4+criteria3/@s3*01+criteria4/@4*0.2 into #temp from tab order by total desc
    select name,total,t_t=(selecl sum(total) from #temp where id<=a.id ) into #temp2 from #temp a order by id
    select  @minrate=min(t_t) from #temp2 where t_t>=0.2
    select name,total from #temp2 where t_t<=@minrate
    end
    goexec dbo.cx
      

  2.   

    笔误CREATE PROCEDURE cx as
    begin
    declare @s1 int,@s2 int ,@s3 int ,@s4 int,@minrate int
    select @s1=sum(criteria1),@s2=sum(criteria2),@s3=sum(criteria3),@s4=sum(criteria4) from tab
    select identity(int, 1,1) as id,name, total=criteria1/@s1*0.3+criteria2/@s2*0.4+criteria3/@s3*01+criteria4/@4*0.2 into #temp from tab order by total desc
    select name,total,t_t=(selecl sum(total) from #temp where id<=a.id ) into #temp2 from #temp a order by id
    select  @minrate=min(t_t) from #temp2 where t_t>=0.2
    select name,total from #temp2 where t_t<=@minrate
    end
    goexec dbo.cx
      

  3.   

    其实就是一个多准则ABC分类算法
    1)首先针对货品在每个criteria里面的表现打分,即这里给出的数值
    2)在每一个criteria下得到所有的货品得分的和(纵列求和)
    3)用每个数值除以所在列对应criteria的得分和,即得到每个货品在每个criteria底下的所占百分比
    4)将上面得到的百分比再乘以对应的权重,即0.4,0.3,0.2,0.1
    5)接着,把每行,也就是按照每个货品的四个criteria下得到的数值求和(横行求和)
    6)把通过横行求和所得的每个货品的值排序,即得到了货品的排序运用这个排序来判断货品的级别,将排序列的数值由大到小,依次加上去,占总值的20%的货品的名称返回,20%-70%的返回为B级,后面的就是C级了这下不知说清了没有。
    除加分外,强烈感谢一下jyxhz(jyxhz)。
      

  4.   

    运行了一下,发现
    第 6 行: 'sum' 附近有语法错误。

    select name,total,t_t=(selecl sum(total) from #temp where id<=a.id ) into #temp2 from #temp a order by id
    不知怎么解决?而且id<=a.id是什么意思?
    分已分完,不好意思,希望大家友情帮助
      

  5.   

    又是笔误select name,total,t_t=(select sum(total) from #temp where id<=a.id ) into #temp2 from #temp a order by id
      

  6.   

    谢谢jyxhz(jyxhz)了
    运行可以了,没有语法错误。
    不过我看起来觉得没有不一样啊?很奇怪。如果你刚好路过,可否指点一下,谢谢。
    (不会是什么中英文切换的问题所致吧?)
      

  7.   

    紧接着这个问题还有些不懂的
    1)这是个存储过程,我其实在tab中还需要定义一个就是每个货品的本身的编号,这些编号呢,是应该和product表里面的一致的,在product中有Pid和Pname等等了。
    那我是该怎么加入这个关系INNER JOIN...ON 表1.pid=表2.Pid来解决么?
    2)我是利用VC来配合数据库做的。因此我希望由SQL直接通过自己查询然后生成一些需要的新表,这样我在VC中只需要设置cSource语言直接调用就可以了。
    比如我需要输入产品编号,输出显示级别A级(前20%),B级(20-60%),后面的C级。
    那我是不是可以这样改动:

    select  name,total,t_t=(select  sum(total)  from  #temp  where  id  <=a.id  )  into  #temp2  from  #temp  a  order  by  id  
    后面这样改的:
    select  name,total,'A' into tab_1 from #temp2 where t_t<=0.2
    select name,total,'B' into tab_2 from #temp2 where t_t<=0.6 AND t_t>0.2
    select name,total,'C' into tab_3 from #temp2
    where t_t>=0.6
    end  
    go  这样我是不是在VC中就可以直接用tab_1,tab_2和tab_3了?
    不好意思,问的问题可能太简单了,不过真的是很初级的选手,希望大家不吝赐教。