3

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

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
4

2 に答える 2

6

これにはを使用できますPIVOT。変換する必要のある列の数がわかっている場合は、静的バージョンを使用できます。

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;

デモ付きのSQLフィドルを参照してください

相関させる値の数が不明な場合は、動的バージョンを使用することをお勧めします。

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)

デモ付きのSQLフィドルを参照してください

編集-コメントに基づいて、別の行に列ヘッダーが必要な場合は、次を使用できます。

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)

デモ付きのSQLフィドルを参照してください

于 2012-10-01T14:16:08.687 に答える
0

問題は、データが十分に完全ではないことです。だから、あなたが必要なものでそれを強化してください:

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が必要になります。

于 2012-10-01T13:58:26.993 に答える