2

私はSQLにこのようなテーブルを持っています(それは順番ではありません)

A B         VAL                  VAL2
---------------------------------------------   
1 1 -2.1846000000000e+02  0.0000000000000e+00
2 2 -2.1846000000000e+02  0.0000000000000e+00
3 2  6.4000000000000e+01  0.0000000000000e+00
1 2  6.4000000000000e+01  0.0000000000000e+00
2 3  6.4000000000000e+01  0.0000000000000e+00
3 3 -2.1846000000000e+02  0.0000000000000e+00
3 1  6.4000000000000e+01  0.0000000000000e+00
2 1  6.4000000000000e+01  0.0000000000000e+00
1 3  6.4000000000000e+01  0.0000000000000e+00

したがって、各タプルA、Bは、行列のポイントを表します。これを次のような実際の行列に変換するにはどうすればよいですか。

A1                      A2                      A3
--------------------------------------------------------------------
-2.1846000000000e+02    6.4000000000000e+01     6.4000000000000e+01
6.4000000000000e+01     -2.1846000000000e+02    6.4000000000000e+01
6.4000000000000e+01     6.4000000000000e+01    -2.1846000000000e+02 
4

2 に答える 2

4

これは、次のようなクエリを使用して実行できます。

select
  max(case when B = 1 then VAL end) as A1,
  max(case when B = 2 then VAL end) as A2,
  max(case when B = 3 then VAL end) as A3
from
  MatrixData D
group by
  A;

任意のサイズの行列を生成するには、次のような動的に生成された SQL コードが必要です。

declare @sql varchar(5000)

select @sql = coalesce(@sql + ',' + char(13) + char(10), '') +
  'max(case when B = ' + cast(B as varchar(10))
    + ' then VAL end) as A' + cast(B as varchar(10))
from
  MatrixData D
group by
  B

set @sql =
  'select
    ' + @sql + '
  from
    MatrixData D
  group by
    A;'
exec(@sql)

デモ: http://www.sqlfiddle.com/#!3/7ee1e/13

于 2012-04-25T18:27:09.047 に答える
3

与えられたテーブル M (x, y, v)

SELECT x, [1], [2], [3], [4], ...
FROM
(SELECT x, y, v FROM M) AS s
PIVOT
(
min(v)
FOR y IN ([1], [2], [3], [4], ...)
) AS pvt
order by x

, ...必要に応じてシリーズを継続することを意味しますが、スクリプトに残さないでください

デモ: http://www.sqlfiddle.com/#!3/7ee1e/17 (セットアップ スクリプトの mellamokb に感謝)

于 2012-04-25T18:28:16.947 に答える