【问题标题】:display data as covariance matrix将数据显示为协方差矩阵
【发布时间】:2017-03-08 01:07:34
【问题描述】:

我有一个查询,它返回下面的第一个表,所以三个列,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

【问题讨论】:

  • 这种类型的转换通常在应用程序级别做得更好。

标签: sql sql-server


【解决方案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

返回:

+------+--------+---------+---------+---------+
| 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

【讨论】:

    【解决方案2】:

    如果您知道您正好有四个值,那么您可以使用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 动态数据透视”——或者在更合适的应用程序中执行此操作。

    【讨论】:

    • 谢谢。我忘了说可能会有新的变量。将谷歌动态枢轴
    【解决方案3】:

    使用 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
    

    【讨论】:

      猜你喜欢
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2017-08-27
      相关资源
      最近更新 更多