2016-10-05 5 views
0

У меня есть таблица, которая выглядит следующим образом:Динамически «Стержень» строк в столбцы - SQL Server

DtCreated    | UserName | Question | Answer 
2016-09-24 14:30:11.927 | mauricio | Senha  | 99658202 
2016-09-24 14:30:11.927 | mauricio | Inteiro  | 10 
2016-09-24 14:30:11.927 | mauricio | Telefone | (915) 438-05 
2016-09-24 14:30:11.927 | mauricio | Email  | [email protected] 
2016-09-24 14:30:11.927 | mauricio | Texto Livre | nksnksjksj nsjsnsjjs 
2016-09-24 14:30:11.927 | mauricio | Decimal  | 0.9 

Как я могу использовать стержень, чтобы преобразовать эти данные в это?

DtCreated    | UserName | Senha | Inteiro | Telefone  | Email      | Texto Livre   | Decimal 
2016-09-24 14:30:11.927 | mauricio | 99658202 | 10  | (915) 438-05 | [email protected] | nksnksjksj nsjsnsjjs | 0.9 

PS: колонка «Вопрос» имеет динамически создаваемые ценности и данные должны быть сгруппированы по «DtCreated» и поля «Имя пользователя».

Это код SQL я использую прямо сейчас:

SELECT 

sf.[DtCreated],  
sf.[UserName], 
fc.Title as Question, 
sv.Value as Answer 

    FROM [form].[SubmissionForm] sf 
    inner join [form].[Submission] s on 
    sf.id = s.SubmissionForm_Id 
    inner join [form].[FormComponent] fc on s.FormComponentId = fc.Id 
    inner join [form].[SubmissionValue] sv on s.Id = sv.Submission_Id 
    where sf.Id = '0DBA8590-C33E-48F8-9E64-C68EEFC536FF' 
    order by sf.[DtCreated] 

Я нашел некоторые динамические примеры поворота, но не мог вместить их в моем конкретном случае. Любая помощь будет оценена по достоинству. Спасибо.

EDIT:

Благодаря ППРР, я почти там. Это динамический поворотный код «сезам Сейчас:

DECLARE @sql  VARCHAR(max)='', 
     @col_list VARCHAR(8000)='' 

SET @col_list = (SELECT DISTINCT Quotename(fc.Title) + ',' 
       FROM [form].[SubmissionForm] sf 
    inner join [form].[Submission] s on 
    sf.id = s.SubmissionForm_Id 
    inner join [form].[FormComponent] fc on s.FormComponentId = fc.Id 
    inner join [form].[SubmissionValue] sv on s.Id = sv.Submission_Id 
       FOR xml path('')) 

SET @col_list = LEFT (@col_list, Len(@col_list) - 1) 

SET @sql = 'select [DtCreated],[UserName]' + @col_list 
      + ' from (SELECT 

sf.[DtCreated],  
sf.[UserName], 
fc.Title, 
sv.Value 

    FROM [form].[SubmissionForm] sf 
    inner join [form].[Submission] s on 
    sf.id = s.SubmissionForm_Id 
    inner join [form].[FormComponent] fc on s.FormComponentId = fc.Id 
    inner join [form].[SubmissionValue] sv on s.Id = sv.Submission_Id 
) pivot (max([sv.Value]) for [fc.Title] in (' 
      + @col_list + '))pv' 

EXEC(@sql) 
+0

Пожалуйста, удалите картинку и добавить образец данных в текстовом формате –

+0

Вы можете использовать динамический стержень или динамическую перекрестную вкладку для такого рода вещей. На это ответили тысячи раз в SO и других местах по всему Интернету. –

+0

У меня возникли проблемы с преобразованием этого кода sql. Можете ли вы показать мне пример кода? Благодарю. – thiago

ответ

1

Вот один из способов сделать это с помощью Dynamic Pivot

DECLARE @sql  VARCHAR(max)='', 
     @col_list VARCHAR(8000)='' 

SET @col_list = (SELECT DISTINCT Quotename([question]) + ',' 
       FROM Yourquery 
       FOR xml path('')) 

SET @col_list = LEFT (@col_list, Len(@col_list) - 1) 

SET @sql = 'select [DtCreated],[UserName]' + @col_list 
      + ' from Yourquery pivot (max([Answer]) for [Question] in (' 
      + @col_list + '))pv' 

EXEC(@sql) 

Update: Вы отсутствуют Alias имя в sub-select

SET @sql = 'select [DtCreated],[UserName]' + @col_list 
      + ' from (SELECT 

sf.[DtCreated],  
sf.[UserName], 
fc.Title, 
sv.Value 

    FROM [form].[SubmissionForm] sf 
    inner join [form].[Submission] s on 
    sf.id = s.SubmissionForm_Id 
    inner join [form].[FormComponent] fc on s.FormComponentId = fc.Id 
    inner join [form].[SubmissionValue] sv on s.Id = sv.Submission_Id 
) a --here 
pivot (max([sv.Value]) for [fc.Title] in (' 
      + @col_list + '))pv' 

EXEC(@sql) 

ДЕМО:

Схема установки

CREATE TABLE #Table1 
    ([DtCreated] datetime, [UserName] varchar(8), [Question] varchar(11), [Answer] varchar(26)) 
; 


INSERT INTO #Table1 
    ([DtCreated], [UserName], [Question], [Answer]) 
VALUES 
    ('2016-09-24 14:30:11', 'mauricio', 'Senha', '99658202'), 
    ('2016-09-24 14:30:11', 'mauricio', 'Inteiro', '10'), 
    ('2016-09-24 14:30:11', 'mauricio', 'Telefone', '(915) 438-05'), 
    ('2016-09-24 14:30:11', 'mauricio', 'Email', '[email protected]'), 
    ('2016-09-24 14:30:11', 'mauricio', 'Texto Livre', 'nksnksjksj nsjsnsjjs'), 
    ('2016-09-24 14:30:11', 'mauricio', 'Decimal', '0.9') 
; 

Запрос:

declare @sql varchar(max)='',@col_list varchar(8000)='' 

set @col_list = (select distinct quotename([Question])+',' from #Table1 
for xml path('')) 

set @col_list = left (@col_list,len(@col_list)-1) 

set @sql = 'select [DtCreated],[UserName]'[email protected]_list+' from 
#Table1 
pivot (max([Answer]) for [Question] in ('[email protected]_list+'))pv' 

exec(@sql) 

Результат:

╔═════════════════════════╦══════════╦════════════════════════════╦═════════╦══════════╦══════════════╦══════════════════════╗ 
║  DtCreated  ║ Decimal ║   Email   ║ Inteiro ║ Senha ║ Telefone ║  Texto Livre  ║ 
╠═════════════════════════╬══════════╬════════════════════════════╬═════════╬══════════╬══════════════╬══════════════════════╣ 
║ 2016-09-24 14:30:11.000 ║ mauricio ║ [email protected] ║  10 ║ 99658202 ║ (915) 438-05 ║ nksnksjksj nsjsnsjjs ║ 
╚═════════════════════════╩══════════╩════════════════════════════╩═════════╩══════════╩══════════════╩══════════════════════╝ 
+0

Я удалил, где предложение и порядок для тестирования, Это то, что я получил: Mensagem 1038, Nível 15, Estado 4, Linha 1 Отсутствует или пустое имя объекта или столбца. Для операторов SELECT INTO убедитесь, что каждый столбец имеет имя. Для других утверждений найдите пустые псевдонимы. Псевдонимы, определенные как «" или [], не допускаются. Измените псевдоним на допустимое имя. Mensagem 156, Nível 15, Estado 1, Linha 13 Неверный синтаксис рядом с ключевым словом 'pivot'. Mensagem 1038, Nível 15, Estado 4, Linha 13 – thiago

+0

@thiago - разместите свой динамический запрос в вопросе –

+0

Хорошо. Готово..... – thiago