有下表:请问如何写SQL语句! T1 品名      西红柿    辣椒      葡萄       苹果      .. 西红柿    1.00     -0.37    0         -0.18     .. 
辣椒     -0.37     1.00     -0.37     0.28      .. 
葡萄     -0.18     -0.37    1.00      -0.75     .. 
苹果     -0.18     0.28     -0.75     1.00      .. 
..       ..        ..       ..        ..        .. 
上表为  对称矩阵 ,即对角线处都为1.00,对角线上下两侧值相对称。列值为除品名外,其余行列名都为相对衬的名,行列为n行n列(即多行多列)。 要求:1)只判断T1以1.00对角线以上的一半矩阵即可(这是必须,不然会有向 【西红柿、辣椒】于【辣椒、西红柿】重复,名字组合只出现一次就行,也可不考虑对 
         称,出现重复只要一个即可),要求循环比较。
 
      2)即依次循环行每一列,(就是从第一行开始,即从品名为西红柿开始)取西红柿与西红柿相交值、西红柿与辣椒相交值、... 、西红柿与最后一列相交值。第二 
         行循环从辣椒与辣椒开始,直到辣椒与最后一列结束;依次到第n行,实际上第n行只比较一个,即行品名值与第n列相交值(只有一组数),其交值一定为1。
         
      3)存放到T2表中:如果西红柿与西红柿交值为1则不处理,如西红柿与辣椒交值为-0.37小于0,则将(西红柿,辣椒)添加到T2表中,标识flag记为-1,如交值 
         大于0则flag记为1,交值等于0,flag记为0即可。T2表结构:  value            flag 
(A1,A2)      -1 
(A1,A3)       0 
(A1,A4)      -1 
(A2,A3)      -1 
(A2,A4)       1 
(A3,A4)      -1 请问SQL语句应如何写?

解决方案 »

  1.   

    重发!上面T2表结构: value                 flag 
    (西红柿,辣椒)           -1 
    (西红柿,葡萄)           0 
    (西红柿,苹果)           -1 
    (辣椒,葡萄)             -1 
    (辣椒,苹果)             1 
    (葡萄,苹果)             -1
     ...                   ...
      

  2.   


    declare @T1 table (品名 varchar(6),西红柿 numeric(3,2),辣椒 numeric(3,2),葡萄 numeric(3,2),苹果 numeric(3,2))
    insert into @T1
    select '西红柿',1.00,-0.37,0,-0.18 union all
    select '辣椒',-0.37,1.00,-0.37,0.28 union all
    select '葡萄',-0.18,-0.37,1.00,-0.75 union all
    select '苹果',-0.18,0.28,-0.75,1.00
     
    select '(西红柿,辣椒)' as value ,floor(辣椒) as flag from @T1 where 品名='西红柿' union all
    select '(西红柿,葡萄)' as value ,floor(葡萄) as flag from @T1 where 品名='西红柿' union all
    select '(西红柿,苹果)' as value ,floor(苹果) as flag from @T1 where 品名='西红柿' union all
    select '(辣椒,葡萄)' as value ,floor(葡萄) as flag from @T1 where 品名='辣椒' union all
    select '(辣椒,苹果)' as value ,floor(苹果) as flag from @T1 where 品名='辣椒' union all
    select '(葡萄,苹果)' as value ,floor(苹果) as flag from @T1 where 品名='葡萄' /*
    value         flag
    ------------- ---------------------------------------
    (西红柿,辣椒)      -1
    (西红柿,葡萄)      0
    (西红柿,苹果)      -1
    (辣椒,葡萄)       -1
    (辣椒,苹果)       0
    (葡萄,苹果)       -1
    */
      

  3.   


    declare @T1 table (品名 varchar(6),西红柿 numeric(3,2),辣椒 numeric(3,2),葡萄 numeric(3,2),苹果 numeric(3,2))
    insert into @T1
    select '西红柿',1.00,-0.37,0,-0.18 union all
    select '辣椒',-0.37,1.00,-0.37,0.28 union all
    select '葡萄',-0.18,-0.37,1.00,-0.75 union all
    select '苹果',-0.18,0.28,-0.75,1.00
     
    select '(西红柿,辣椒)' as value ,cast(sign(辣椒) as int) as flag from @T1 where 品名='西红柿' union all
    select '(西红柿,葡萄)' as value ,cast(sign(葡萄) as int) as flag from @T1 where 品名='西红柿' union all
    select '(西红柿,苹果)' as value ,cast(sign(苹果) as int) as flag from @T1 where 品名='西红柿' union all
    select '(辣椒,葡萄)' as value ,cast(sign(葡萄) as int) as flag from @T1 where 品名='辣椒' union all
    select '(辣椒,苹果)' as value ,cast(sign(苹果) as int) as flag from @T1 where 品名='辣椒' union all
    select '(葡萄,苹果)' as value ,cast(sign(苹果) as int) as flag from @T1 where 品名='葡萄' /*
    value         flag
    ------------- -----------
    (西红柿,辣椒)      -1
    (西红柿,葡萄)      0
    (西红柿,苹果)      -1
    (辣椒,葡萄)       -1
    (辣椒,苹果)       1
    (葡萄,苹果)       -1
    */
      

  4.   

    楼上的方法还是不够灵活,我的T1表是活的,有很多行,列,且行列式对称矩阵,有规律的,我不能这样每个字段都写select啊,这样没法做啊,还是要谢谢楼上的!Up!Up!Up!
      

  5.   

    发表于:2009-04-29 12:53:04
    你的对角阵有问题,西红柿和葡萄对应的不一样 一个是0 一个是-0.18对不起添错了,葡萄和西红柿的-0.18改为0.这样就对称了.Up!Up!Up! 
      

  6.   

    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([品名] varchar(6),[西红柿] numeric(3,2),[辣椒] numeric(3,2),[葡萄] numeric(3,2),[苹果] numeric(3,2))
    insert [tb]
    select '西红柿',1.00,-0.37,0,-0.18 union all
    select '辣椒',-0.37,1.00,-0.37,0.28 union all
    select '葡萄',0,-0.37,1.00,-0.75 union all
    select '苹果',-0.18,0.28,-0.75,1.00
    go
    --select * from [tb]create table #t(value varchar(20),flag int)select id=identity(int,1,1),品名 into #1 from tbselect a.品名 name1,b.品名 name2 into #2 from #1 a join #1 b on a.id<b.iddeclare @sql nvarchar(max)select @sql=isnull(@sql+' union all ','insert #t ')+' select ''('+name1+','+name2+')'',(select sign('+name2+') from tb where 品名='''+name1+''')'
    from #2exec(@sql)select * from #t
    /*
    value                flag
    -------------------- -----------
    (西红柿,辣椒)             -1
    (西红柿,葡萄)             0
    (辣椒,葡萄)              -1
    (西红柿,苹果)             -1
    (辣椒,苹果)              1
    (葡萄,苹果)              -1(6 行受影响)
    */
    drop table #t