2017-03-07 122 views
1

我有一个查询返回下面的第一个表,所以三列Var1(变量1),Var2 &协方差。显示数据为协方差矩阵

但是我想要做的是将数据以协方差矩阵的形式返回,如果可能的话?

Var1 Var2 Covariance 
ABC ABC 0.00213334 
DEF ABC 4.75E-05 
DEF DEF 0.0015896 
MNO ABC 0.00012669 
MNO DEF 0.000278643 
MNO MNO 0.001189053 
XYZ ABC 0.000456708 
XYZ DEF -0.00030231 
XYZ MNO -0.000390762 
XYZ XYZ 0.002947633 

结果我想,协方差矩阵。

 ABC  DEF  MNO  XYZ 
    ABC 0.0021 0.0000 0.0001 0.0005 
    DEF 0.0000 0.0016 0.0003 -0.0003 
    MNO 0.0001 0.0003 0.0012 -0.0004 
    XYZ 0.0005 -0.0003 -0.0004 0.0029 
+0

这种类型的转换,则通常在应用层面更好。 –

回答

1

动态透视:

declare @cols nvarchar(max); 
declare @sql nvarchar(max); 
    select @cols = stuff((
    select distinct 
     ', ' + var1 
     from t 
     order by 1 
     for xml path (''), type).value('.','nvarchar(max)') 
    ,1,2,'') 
select @sql = ' 
select var2, ' + @cols + ' 
    from (
    select var1, var2, covariance=round(covariance,4) 
    from t 
    union all 
    select var2, var1, covariance=round(covariance,4) 
    from t 
    ) as t 
pivot (max([Covariance]) for [var1] in (' + @cols + ')) p' 
--select @sql 
exec(@sql); 

rextester演示:http://rextester.com/XTZ92563

retur NS:产生

+------+--------+---------+---------+---------+ 
| var2 | ABC | DEF | MNO | XYZ | 
+------+--------+---------+---------+---------+ 
| ABC | 0,0021 | 0  | 0,0001 | 0,0005 | 
| DEF | 0  | 0,0016 | 0,0003 | -0,0003 | 
| MNO | 0,0001 | 0,0003 | 0,0012 | -0,0004 | 
| XYZ | 0,0005 | -0,0003 | -0,0004 | 0,0029 | 
+------+--------+---------+---------+---------+ 

查询:

select var2, ABC, DEF, MNO, XYZ 
    from (
    select var1, var2, covariance=round(covariance,4) 
     from t 
    union all 
    select var2, var1, covariance=round(covariance,4) 
     from t 
    ) as t 
pivot (max([Covariance]) for [var1] in (ABC, DEF, MNO, XYZ)) p 
0

如果你知道你有正好四个值,那么你可以使用pivot或有条件聚集:

select max(case when col2 = 'ABC' then covariance else 0 end) as ABC, 
     max(case when col2 = 'DEF' then covariance else 0 end) as DEF, 
     max(case when col2 = 'MNO' then covariance else 0 end) as MNO, 
     max(case when col2 = 'XYZ' then covariance else 0 end) as XYZ 
from t 
group by col1; 

如果你有一个变量数列,那么你可以在google的“SQL Server动态枢轴“ - 或者在更合适的应用程序中执行此操作。

+0

谢谢。我忘了说有可能会有新的变数。将谷歌的动态枢轴 – mHelpMe

0

使用PIVOT

示例脚本

Select var1,ABC,DEF,MNO,XYZ from (
Select 
var1, 
[1] ABC, 
[2] DEF, 
[3]MNO, 
[4]XYZ 
    from (
select 
Var1 , 
Covariance, 
ROW_NUMBER()OVER(PARTITION BY Var2 ORDER BY (select NULL))RN 
from 
    Table1)T 
PIVOT (MAX(Covariance) FOR RN IN ([1],[2],[3],[4]))PVT)T