有下表:请问如何写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语句应如何写?
辣椒 -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
(西红柿,葡萄) 0
(西红柿,苹果) -1
(辣椒,葡萄) -1
(辣椒,苹果) 1
(葡萄,苹果) -1
... ...
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
*/
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
*/
你的对角阵有问题,西红柿和葡萄对应的不一样 一个是0 一个是-0.18对不起添错了,葡萄和西红柿的-0.18改为0.这样就对称了.Up!Up!Up!
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