2013-09-10 4 views
2

У меня есть таблица, состоящая из pageno int, groupid varchar (10). Каждая строка в таблице отличается. Могут быть несколько комбинаций groupid и pageno. Количество pagenos неизвестно, и количество групп неизвестно. Данные могут выглядеть следующим образом:Динамический сводный стол или что?

pageno groupid 
101105 mpadilla 
101105 gentry 
100100 mpadilla 
100100 gentry 

Я хотел бы иметь результирующий набор, возвращаемый который показывает pagenos как столбцов и groupids в виде строк и х, где они пересекаются (что означает, что существует для этого pageno/GroupID комбо).

Могу ли я использовать sql pivot для этого? Если да, дайте мне пример, пожалуйста. Если нет, укажите свой пример и пояснения. Я немного запутался.

ответ

2

Ваши требования не совсем понятны, но если я понимаю ваш вопрос, вы можете использовать функцию 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 |  | 
+0

Thank you bluefeet. Это очень похоже на то, с чем я закончил. Можете ли вы просмотреть мой код и расширить его? Я хочу знать, как изменить NULLS на пустой или какой-либо другой текст, чтобы облегчить чтение результатов. Прямо сейчас у меня МНОГИЕ НУЛЛЫ, и это загромождает результаты. – user2766661

+0

@ user2766661 см. Мое редактирование, вы создадите второй список столбцов, который будет использоваться для замены нулей. – Taryn

+0

Спасибо, bluefeet, но я немного запутался в том, как перевести свой код в мой. Можете ли вы посмотреть на мой код и дать мне пример из того, как использовать coalesce. Я смотрел на множество примеров, кроме вас, и я до сих пор не могу заставить его работать с моим кодом. См. Мой код ниже, где я ответил на свой первоначальный вопрос. Еще раз спасибо! – user2766661

-1

Я ответил на свой вопрос. То, что я сделал, это добавить дополнительный столбец под названием customized to my original table. Этот столбец содержит только х для каждой настраиваемой страницы. Вид избыточного я знаю, но кажется, что сводная таблица нуждается в 3 колонках. Итак, вот мой динамический код, который я придумал и работает:

DECLARE @query VARCHAR(4000), @groupids VARCHAR(8000) 
SELECT @groupids = STUFF((SELECT DISTINCT 
    '],[' + LTRIM(groupid) 
    FROM DistinctPages 
    ORDER BY '],[' + LTRIM(groupid) 
    FOR XML PATH('') 
    ), 1,2, '') + ']' 
SET @query = 
'SELECT * FROM (SELECT pageno, groupid, customized FROM DistinctPages)t 
PIVOT (MAX(customized) FOR groupid 
IN ('[email protected]+')) AS CustomizedPagesPerGroups' 
EXECUTE (@query) 
Смежные вопросы