あなたの要件は完全に明確ではありませんが、私があなたの質問を理解していれば、PIVOT関数を使用して結果を得ることができます。
の数が限られている場合、クエリのこのクエリの基本的な構文は次のようになりますpagenos
。
select groupid, [101105], [100100]
from
(
select pageno, groupid,
flag = 'X'
from yourtable
) d
pivot
(
max(flag)
for pageno in ([101105], [100100])
) piv;
SQL Fiddle with Demoを参照してください。
次に、値の数が不明な場合は、動的 SQL を使用する必要があります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(pageno)
from yourtable
group by pageno
order by pageno
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT groupid, ' + @cols + '
from
(
select pageno, groupid,
flag = ''X''
from yourtable
) x
pivot
(
max(flag)
for pageno in (' + @cols + ')
) p '
execute sp_executesql @query;
SQL Fiddle with Demoを参照してください。両方のバージョンで結果が得られます。
| GROUPID | 100100 | 101105 |
| gentry | X | X |
| mpadilla | X | X |
| test | X | (null) |
編集、置き換えたいnullがある場合は、列名の2番目のリストを作成します。これは最終的な選択リストに使用されcoalesce
、nullを置き換えるために含まれます。コードは次のようになります。
DECLARE @cols AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(pageno)
from yourtable
group by pageno
order by pageno
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsNull = STUFF((SELECT ', coalesce(' + QUOTENAME(pageno) +', '''') as '+QUOTENAME(pageno)
from yourtable
group by pageno
order by pageno
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT groupid, ' + @colsNull + '
from
(
select pageno, groupid,
flag = ''X''
from yourtable
) x
pivot
(
max(flag)
for pageno in (' + @cols + ')
) p '
execute sp_executesql @query;
SQL Fiddle with Demoを参照してください。結果は次のようになります。
| GROUPID | 100100 | 101105 |
| gentry | X | X |
| mpadilla | X | X |
| test | X | |