Ваши требования не совсем понятны, но если я понимаю ваш вопрос, вы можете использовать функцию 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) |
Редактировать, если у вас есть аннулируют, которые вы хотите заменить, то я бы создать второй список имен столбцов это один будет использоваться для окончательного списка выбора, и он будет включать в себя coalesce
, чтобы заменить нуль. Код будет следующим:
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 | |
Thank you bluefeet. Это очень похоже на то, с чем я закончил. Можете ли вы просмотреть мой код и расширить его? Я хочу знать, как изменить NULLS на пустой или какой-либо другой текст, чтобы облегчить чтение результатов. Прямо сейчас у меня МНОГИЕ НУЛЛЫ, и это загромождает результаты. – user2766661
@ user2766661 см. Мое редактирование, вы создадите второй список столбцов, который будет использоваться для замены нулей. – Taryn
Спасибо, bluefeet, но я немного запутался в том, как перевести свой код в мой. Можете ли вы посмотреть на мой код и дать мне пример из того, как использовать coalesce. Я смотрел на множество примеров, кроме вас, и я до сих пор не могу заставить его работать с моим кодом. См. Мой код ниже, где я ответил на свой первоначальный вопрос. Еще раз спасибо! – user2766661