3

4 つの列と 1 億を超えるレコードを含むテーブルがあります。テーブルのデザイン:

ID char(12) PK 
Type Char(2) PK (Values 1,2,3)
DCID varchar(10) Null
IND Varchar(2) Null (Values Y, N)

これは次のようにピボットする必要があります

ID, DCID1, DCID2, DCID3, IND1, IND2, IND3

タイプの値が 1 の場合、ピボット テーブルには値が含まれている必要DCID1があり、タイプが 2 の場合はDCID2値が含まれている必要があります。また、対応も、、 のようINDに配置する必要があります。IND1IND2IND3

これをどのようにピボットするのですか?

4

1 に答える 1

5

UNPIVOT 関数と PIVOT 関数の両方を使用して結果を取得することをお勧めします。

UNPIVOT は、複数の列を 1 つの列の複数の行に変換するために使用されDCIますIND。それが完了したら、データをピボットして列に戻すことができます。

UNPIVOT コードは次のようになります。

select id,
  col +type as new_col,
  value
from
(
  select id,
    type, 
    dcid, 
    cast(ind as varchar(10)) ind
  from yt
) d
unpivot
(
  value
  for col in (DCID, IND)
) unpiv;

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

|           ID | NEW_COL | VALUE |
----------------------------------
| 1            |  dcid1  |  test |
| 1            |   ind1  |     Y |
| 2            |  dcid2  |   est |
| 2            |   ind2  |     Y |

にはと名前が含まれ、末尾に連結されたnew_col値があります。この新しい値は、PIVOT を適用するものになります。DCIDINDtype

select id, DCID1, DCID2, DCID3, IND1, IND2, IND3
from
(
  select id,
    col +type as new_col,
    value
  from
  (
    select id,
      type, 
      dcid, 
      cast(ind as varchar(10)) ind
    from yt
  ) d
  unpivot
  (
    value
    for col in (DCID, IND)
  ) unpiv
) src
pivot
(
  max(value)
  for new_col in (DCID1, DCID2, DCID3, IND1, IND2, IND3)
) piv;

SQL Fiddle with Demoを参照してください。結果は次のようになります。

|           ID | DCID1 | DCID2 | DCID3 | IND1 | IND2 | IND3 |
-------------------------------------------------------------
| 1            |  test |       |       |    Y |      |      |
| 2            |       |   est |       |      |    Y |      |
| 3            |       |       |  blah |      |      |    Y |
| 4            |   yes |       |       |    N |      |      |
| 5            |       |    hs |       |      |    N |      |
| 6            |       |       |    jr |      |      |    N |
于 2013-05-08T16:41:50.167 に答える