0

行を列に変換しようとしていますが、データの並べ替えが含まれています。

サンプル データの例:

+-----+------+------+
| CId | Cat1 | cat2 |
+-----+------+------+
|   1 |   10 |    6 |
|   1 |  230 |  100 |
|   2 | 1222 |   30 |
|   3 |    2 |   50 |
|   4 |   33 |   21 |
|   1 |   33 |   13 |
+-----+------+------+

期待される出力

+-----+------+-----+-----+-----+-----+-----+
| CId | Rw1  | Rw2 | Rw3 | Rw4 | Rw5 | Rw6 |
+-----+------+-----+-----+-----+-----+-----+
|   1 |   10 |  33 | 230 |   6 |  13 | 100 |
|   2 | 1222 |  30 |   0 |   0 |   0 |   0 |
|   3 |    2 |  50 |   0 |   0 |   0 |   0 |
|   4 |   33 |  21 |   0 |   0 |   0 |   0 |
+-----+------+-----+-----+-----+-----+-----+

それが完了した後、CID: 1すべての値がどのようにソートされたかを確認し、ソートする必要があり、すべてが 1 つの行にある必要があります。Cat1cat2

方法を教えてください。

4

1 に答える 1

3

データのピボットを解除してピボットすることで結果を取得できますが、必要row_number()な順序でデータを保持するために を使用することもできます。

最初のステップは、現在のデータをクエリし、 を適用しrow_number()て各行の値を取得し、 で分割してとcidで並べ替えることです。cat1cat2

select cid, cat1, cat2,
  row_number() over(partition by cid order by cat1, cat2) seq
from yourtable

デモを参照してください。データを取得したら、複数の列をアンピボットして、cat1複数cat2の行を持つ単一の列にします。UNPIVOT 関数を使用するか、CROSS APPLY を使用してデータを変換できます。

select cid, value
  , 'rw'+cast(row_number() over(partition by cid order by col, seq) as varchar(10)) rw
from 
(
  select cid, cat1, cat2,
    row_number() over(partition by cid order by cat1, cat2) seq
  from yourtable
) d
cross apply
(
  select 1, cat1 union all
  select 2, cat2
) c (col, value)

デモを参照してください。データのピボットを解除すると、もう一度適用row_number()されます。これは、新しい列名の作成に使用されます。今回適用すると、データを で分割しcid、列cat1/ cat2(私は1/を使用2しました) と元に作成したシーケンスで並べ替えます。この新しい行番号により、すべての新しい列ヘッダーが作成され、表示したい順序でデータが保持されます。

最後に、PIVOT 関数を適用します。

select cid,
  coalesce(rw1, 0) rw1, 
  coalesce(rw2, 0) rw2, 
  coalesce(rw3, 0) rw3, 
  coalesce(rw4, 0) rw4, 
  coalesce(rw5, 0) rw5, 
  coalesce(rw6, 0) rw6
from 
(
  select cid, value
    , 'rw'+cast(row_number() over(partition by cid order by col, seq) as varchar(10)) rw
  from 
  (
    select cid, cat1, cat2,
      row_number() over(partition by cid order by cat1, cat2) seq
    from yourtable
  ) d
  cross apply
  (
    select 1, cat1 union all
    select 2, cat2
  ) c (col, value)
) src
pivot
(
  max(value)
  for rw in (rw1, rw2, rw3, rw4, rw5, rw6)
) piv;

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

| CID |  RW1 | RW2 | RW3 | RW4 | RW5 | RW6 |
|-----|------|-----|-----|-----|-----|-----|
|   1 |   10 |  33 | 230 |   6 |  13 | 100 |
|   2 | 1222 |  30 |   0 |   0 |   0 |   0 |
|   3 |    2 |  50 |   0 |   0 |   0 |   0 |
|   4 |   33 |  21 |   0 |   0 |   0 |   0 |
于 2013-10-23T23:53:17.360 に答える