Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中创建关联矩阵_Sql_Sql Server_Tsql - Fatal编程技术网

在SQL Server中创建关联矩阵

在SQL Server中创建关联矩阵,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图在SQL Server中获取相关矩阵,我的数据以以下方式显示在表中: RptLOB1 RptLOB2 Correlation AE AE 1 Bail AE 0.35 Commercial Bail 0.25 Commercial AE 0.15 AE Bail Commercial AE 1

我试图在SQL Server中获取相关矩阵,我的数据以以下方式显示在表中:

RptLOB1     RptLOB2   Correlation
AE          AE             1
Bail        AE            0.35
Commercial  Bail          0.25
Commercial  AE            0.15
            AE     Bail   Commercial
AE          1      0.35      0.15
Bail        0.35    1        0.25
Commercial  0.15   0.25       1
……等等

我想写一段代码,以便我的输出如下所示:

RptLOB1     RptLOB2   Correlation
AE          AE             1
Bail        AE            0.35
Commercial  Bail          0.25
Commercial  AE            0.15
            AE     Bail   Commercial
AE          1      0.35      0.15
Bail        0.35    1        0.25
Commercial  0.15   0.25       1
RptLOB的顺序并不重要,只要从上到下和从左到右的顺序相同。我一直在试图找到一种方法来解决这个问题,但我不太确定最好的方法是什么。我曾考虑使用PIVOT,但它不会在顶部输出RptLOB(它们将被视为表中的列)

编辑:

此输出将插入另一个表中,如下所示:

col1             col2        col3                            col4        col5              

Generic
Company Inputs   Insurance   Stochastic Model Correlations   Exposure    Correlation Matrix
                 AE          Bail                            Commercial
AE               1           0.35                            0.15
Bail             0.35        1                               0.25
Commercial       0.15        0.25                            1

问题是您的数据不够完整。因此,根据您的需要对其进行增强:

with d as (
    select RptLOB1, RptLOB2, Correlation from t union all
    select RptLOB2, RptLOB1, Correlation from t union all
    select distinct RptLob1, RptLob1, 1.0 from t
)
select RptLOB1, RptLOB2, Corr
from d
pivot (max(correlation) for val in ('AE', 'Bail', 'Commercial')) as corr

如果您不知道所有值的名称,那么对于一般情况,您需要使用动态SQL。

您可以使用
透视。如果知道必须转换的列数,则可以使用静态版本:

select *
from 
(
  select RptLOB1 RptLOB1, RPTLOB2 RPTLOB2, Correlation
  from yourtable
  union all
  select RPTLOB2, RptLOB1, Correlation
  from yourtable
  union all
  select distinct RptLOB1, RptLOB1, 1.0
  from yourtable
) x
pivot
(
  max(Correlation)
  for RPTLOB2 in ([AE], [Bail], [Commercial])
) p;
DECLARE @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT distinct  ',' 
                      + quotename(RptLOB1)
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query 
  = 'select RptLOB1, '+@colspivot+ '
     from 
     (
       select RptLOB1 RptLOB1, RPTLOB2 RPTLOB2, Correlation
       from yourtable
       union all
       select RPTLOB2, RptLOB1, Correlation
       from yourtable
       union all
       select distinct RptLOB1, RptLOB1, 1.0
       from yourtable
      ) x
      pivot
      (
        max(Correlation) 
        for RPTLOB2 in ('+ @colspivot +')
      ) p'

exec(@query)
看见 如果要关联的值数目未知,则需要使用动态版本:

select *
from 
(
  select RptLOB1 RptLOB1, RPTLOB2 RPTLOB2, Correlation
  from yourtable
  union all
  select RPTLOB2, RptLOB1, Correlation
  from yourtable
  union all
  select distinct RptLOB1, RptLOB1, 1.0
  from yourtable
) x
pivot
(
  max(Correlation)
  for RPTLOB2 in ([AE], [Bail], [Commercial])
) p;
DECLARE @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT distinct  ',' 
                      + quotename(RptLOB1)
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query 
  = 'select RptLOB1, '+@colspivot+ '
     from 
     (
       select RptLOB1 RptLOB1, RPTLOB2 RPTLOB2, Correlation
       from yourtable
       union all
       select RPTLOB2, RptLOB1, Correlation
       from yourtable
       union all
       select distinct RptLOB1, RptLOB1, 1.0
       from yourtable
      ) x
      pivot
      (
        max(Correlation) 
        for RPTLOB2 in ('+ @colspivot +')
      ) p'

exec(@query)
看见 编辑-根据您的注释,如果希望列标题位于另一行中,则可以使用以下选项:

DECLARE @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX),
    @colsRow as  NVARCHAR(MAX),
    @colsConverted as  NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT distinct  ',' 
                      + quotename(RptLOB1)
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsRow = STUFF((SELECT distinct  ', ''' 
                      + RptLOB1 + ''' as ' + RptLOB1
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsConverted
      = STUFF((SELECT distinct  ', CAST(' 
                + quotename(RptLOB1) 
                 + ' as varchar(50))'
                from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select ''RptLOB1'' as RptLOB1, 
      '+ @colsRow + '
     union all 
     select RptLOB1, '+ @colsConverted+ '
     from 
     (
       select RptLOB1 RptLOB1, RPTLOB2 RPTLOB2, Correlation
       from yourtable
       union all
       select RPTLOB2, RptLOB1, Correlation
       from yourtable
       union all
       select distinct RptLOB1, RptLOB1, 1.0
       from yourtable
      ) x
      pivot
      (
        max(Correlation) 
        for RPTLOB2 in ('+ @colspivot +')
      ) p'

exec(@query)

请看@OMGPonies我能想到的唯一一件事就是旋转行值来创建顶行,但如果我这样做,行值就会变成列标题,这不是我想要的。我不确定如何处理,这样就不会发生这种情况,我可以创建矩阵……我认为使用纯SQL将非常困难。我建议尝试其他工具,比如R编程语言。如果您不希望列成为列标题,那么您会遇到数据类型不匹配的问题。使用R编程没什么大不了的,但我需要为我在SQL中所做的编写代码。我是否能够创建一个包含46列(我拥有的RptLOB数量)的临时表,并将这些RptLOB旋转到一行?非常感谢!有没有办法显示列标题(因为它包含其他RptLOB)?这最终将在动态sql中完成。@Kristina我不确定您所说的列标题是什么意思?当获取
@colspivot
@bluefeet的值时,会在动态sql中检索列标题。最终,我将编写一个动态sql语句,以便它吐出整个相关表,并希望它显示列名。基本上,这个相关矩阵将在另一个表中。@Kristina我不明白你在问什么,你能发布一个你需要的最终结果的样本吗?@Kristina你想把列标题作为表中的一行吗?