7

私は現在、次のように設定された2つのテーブルを持つシステムに取り組んでいます:

Table_1
-------
ID
Table2ID
Value



Table_2
--------
ID
ColumnName

各テーブルからのいくつかの模擬結果:

Table_1

Table2ID   |   Value
---------------
1          |   ABCD
1          |   EFGH
1          |   IJKL
2          |   MNOP
2          |   QRST
2          |   UVWX


Table_2

ID   |   ColumnName
--------------------
1    |   First_Set
2    |   Second_Set

したがって、次のクエリがあり、Table_2 の行の結果を列に変換しようとしています。

SELECT *
FROM(
SELECT B.ColumnName, A.Value
FROM Table_1 AS A 
     INNER JOIN Table_2 AS B ON A.Table2ID = B.ID
     ) AS P
   PIVOT
   (
       min(P.Value)
       for P.ColumnName in ([First_Set], [Second_Set])
   ) AS PIV

問題は、書かれているように、単一の結果が返されることです。私の戻り値は次のようになります。

    First_Set  |  Second_Set
    -------------------------
    ABCD       |  MNOP

私が欲しいのは、各列のすべての結果ですが、それを可能にする PIVOT の使用方法を見つけることができませんでした。

行を列に変換し、各列に対して複数の結果を受け取る最良の方法について誰か提案がありますか?

4

1 に答える 1

14

PIVOT では、結果を取得するために集計関数を使用する必要があります。この場合min、クエリでFirst_Setandに対して 1 つの値のみを返す関数を使用していますSecond_Set。PIVOT を適用するときに行を区別するために使用される列を含めることをお勧めします。

あなたのデータについてrow_number()は、セット内の各アイテムに一意の値を生成するために使用することをお勧めします。この値は、PIVOT のグループ化の側面で使用されます。

SELECT [First_Set], [Second_Set]
FROM
(
  SELECT B.ColumnName, A.Value
    , row_number() over(partition by a.Table2ID
                        order by a.Value) seq
  FROM Table_1 AS A 
  INNER JOIN Table_2 AS B 
    ON A.Table2ID = B.ID
) AS P
PIVOT
(
  min(P.Value)
  for P.ColumnName in ([First_Set], [Second_Set])
) AS PIV;

SQL Fiddle with Demoを参照してください。これにより、次の結果が得られます。

| FIRST_SET | SECOND_SET |
|      ABCD |       MNOP |
|      EFGH |       QRST |
|      IJKL |       UVWX |
于 2013-09-17T13:54:19.463 に答える