0

MS SQL 2008のselectクエリの表示結果を非常にユニークな方法で作成し、誰かが私を助けてくれることを願っています。

3列の結果を9行に表示する代わりに、データを1行に表示し、3列の名前を9回繰り返します。

私はこれをグーグルしようとしましたが、どこにも正しいアイデアを見つけることができないようです。

助けてくれる人に感謝します!

写真を投稿したかったのですが、それを行うには担当者ポイントが必要です。これはとても愚かです。しかし、とにかく私はPostgreSQL8.3で回答された同様の投稿を見つけました。しかし、私は完全な初心者なので、翻訳方法がMSSQL用であるかわかりません。

前:

col1 |  col2  |  col3   |
-----|--------|---------|
 a   |12/01/12| 13/01/12|
-----|--------|---------|
 b   |14/01/12| 14/01/12|

後:

col1 |  col2  |  col3   |col1 |  col2  |  col3   |
-----|--------|---------|-----|--------|---------|
 a   |12/01/12| 13/01/12| b   |14/01/12| 15/01/12|
-----|--------|---------|-----|--------|---------|

これが私の状況をよりよく理解するためのリンクです 複数の行を複数の列を持つ1つの行に変換します

4

1 に答える 1

3

SQL Server 2005以降では、PIVOTこの関数を使用してこれを実行できます。ピボットは行から値を取得し、それを列に変換します。

データをピボットする方法はいくつかあります。事前にすべての値がわかっている場合は、クエリをハードコーディングできます。それ以外の場合は、動的SQLを使用して実行時にクエリを生成できます。

ピボットの静的バージョンは次のようになります。

select *
from
(
  select col1, col2
  from table1
) src
pivot
(
  max(col1)
  for col2 in (test, blah, value)
) piv

SQL FiddlewithDemoを参照してください。

値の数が不明な場合は、次のような動的SQLを生成します。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col2) 
                    from table1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
             (
                select col1, col2
                from table1
            ) x
            pivot 
            (
                max(col1)
                for col2 in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

これらはcol2、テーブルから行の値を取得し、それらを列に変換しています。両方の結果は同じです。

| TEST | BLAH | VALUE |
-----------------------
|    1 |    2 |     3 |

SQL Server 2005より前、またはピボット関数を持たないデータベースでは、式を含む集計関数を使用しcaseてデータを変換していました。

select 
  max(case when col2 = 'test' then col1 end) test,
  max(case when col2 = 'blah' then col1 end) blah,
  max(case when col2 = 'value' then col1 end) value
from table1

SQL FiddlewithDemoを参照してください

列を繰り返したい場合にこれを行うもう1つの方法は、UNPIVOTandPIVOT関数を一緒に使用して結果を取得することです。サンプルデータがある場合:

CREATE TABLE yourtable
    ([id] int, [name] varchar(10), [type] varchar(10))
;

INSERT INTO yourtable
    ([id], [name], [type])
VALUES
    (1, 'John', 'dog'),
    (2, 'Tim', 'bird'),
    (3, 'Betty', 'cat'),
    (4, 'Jim', 'rat')
;

そして、繰り返し列の値と値を繰り返したいid場合nametype、次を使用できます。

select *
from
(
  select 
    col +'_'+cast(rn as varchar(50)) col ,
    value
  from
  (
    select 
      cast(id as varchar(10)) id,
      name, 
      type,
      row_number() over(order by id) rn
    from yourtable
  ) src
  unpivot
  (
    value
    for col in (id, name, type)
  ) unpiv
) src
pivot
(
  max(value)
  for col in (id_1, name_1, type_1,
              id_2, name_2, type_2,
              id_3, name_3, type_3,
              id_4, name_4, type_4)
) piv

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

| ID_1 | NAME_1 | TYPE_1 | ID_2 | NAME_2 | TYPE_2 | ID_3 | NAME_3 | TYPE_3 | ID_4 | NAME_4 | TYPE_4 |
-----------------------------------------------------------------------------------------------------
|    1 |   John |    dog |    2 |    Tim |   bird |    3 |  Betty |    cat |    4 |    Jim |    rat |

#2を編集し、サンプルデータを確認して、次を使用できます。

select *
from
(
  select 
    col +'_'+cast(rn as varchar(50)) col ,
    value
  from
  (
    select 
      col1,
      convert(varchar(10), col2, 120) col2, 
      convert(varchar(10), col3, 120) col3, 
      row_number() over(order by col1) rn
    from yourtable
  ) src
  unpivot
  (
    value
    for col in (col1, col2, col3)
  ) unpiv
) src
pivot
(
  max(value)
  for col in (col1_1, col2_1, col3_1,
              col1_2, col2_2, col3_2)
) piv

SQL FiddlewithDemoを参照してください

結果を出します:

| COL1_1 |     COL2_1 |     COL3_1 | COL1_2 |     COL2_2 |     COL3_2 |
-----------------------------------------------------------------------
|      a | 2012-01-12 | 2012-01-13 |      b | 2012-01-14 | 2012-01-14 |
于 2013-01-25T14:00:55.877 に答える