7

データマイニングを容易にするために、データセットを「平坦化」しようとしています。各カテゴリ列を複数のブール列に変更する必要があります。カテゴリ値を含む列があります。たとえば、次のとおりです。

 ID    col1
  1     A
  2     B
  3     A

このテーブルをピボットする方法を探しており、この ID の値が A か B かを示す集計関数を使用しています。

結果:

 ID    col1A    col1B
  1     1        0
  2     0        1
  3     1        0

PIVOT を使用してみましたが、その中で使用する集計関数がわかりません。

SFでも答えを探しましたが、何も見つかりませんでした...

MS-SQL 2012 を使用しています。

どんな助けでも大歓迎です!オムリ

編集:

col1 のカテゴリ数は不明であるため、ソリューションは動的でなければなりません。ありがとう :)

4

1 に答える 1

11

これを試して:

select ID,
         col1A=(case when col1='A' then 1 else 0 end),
         col1B=(case when col1='B' then 1 else 0 end)
  from <table>    


AとBの両方を持つ1つのIDがあり、出力に個別のIDが必要な場合は、次のことができます。

 select ID,
         col1A=max(case when col1='A' then 1 else 0 end),
         col1B=max(case when col1='B' then 1 else 0 end)
  from <table> 
  group by id

編集

コメントによると、col1のオプションの数がわからない場合は、動的PIVOTを使用できます。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1) 
                    from <table> 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' from <table> 

            pivot 
            (
                count([col1])
                for col1 in (' + @cols + ')
            ) p '
print(@query)
execute(@query)


SQLフィドルデモ

于 2012-08-21T05:50:33.727 に答える