2012-05-04 5 views
3

Я думаю, что PIVOT поможет мне в этом, но я не могу ничего начать. Сегодня у меня серьезные сердечные судороги SQL, мне нужна помощь.Построение PIVOT

Вот результат я сейчас:

Id Name Question Answer 
0  Test Vault  A 
0  Test Container 1 
1  Foo Vault  B 
1  Foo Container 2 

И это мой желаемый результат:

Id Name Vault Container 
0 Test A 1 
1 Foo B 2 

Можно ли это сделать?

Если это невозможно или ужасно сложно сделать, у меня есть альтернативный способ приблизиться к этому. Выход для моего альтернативного запроса:

Id Name VaultId ContainerId 
0 Test A  NULL 
0 Test NULL  1 
1 Foo B  NULL 
1 Foo NULL  2 

И здесь я должен быть в состоянии подавить его в один ряд на Id/Name. Я не помню, как это сделать!

ответ

5
DECLARE @Test TABLE 
(
    Id  INT 
    ,[Name]VARCHAR(10) NOT NULL 
    ,Question  VARCHAR(10) NOT NULL, 
    Answer VARCHAR(10) 

); 
INSERT @Test VALUES (0,'test1', 'vault','a'); 
INSERT @Test VALUES (0,'test1', 'Container ','1'); 
INSERT @Test VALUES (1,'test4', 'vault','b'); 
INSERT @Test VALUES (1,'test4', 'Container','2'); 



;WITH CTE 
AS 
(
    SELECT t.id, t.[Name], t.[Question ] ,t.Answer 
    FROM @Test t 
) 

SELECT * 
FROM CTE 
PIVOT (max(answer) FOR Question  IN (vault,container)) f; 

enter image description here

+0

Спасибо Я получил это работает :) Я буду практиковать с 'PIVOT' какой мощной вещью! –

2

Да PIVOT это то, что вам нужно здесь :). Если предположить, что таблица называется MyPivot Try:

SELECT Id, Name, [Vault], [Container] 
FROM (SELECT Id, Name, Question, Answer FROM MyPivot) AS SourceTable 
PIVOT (MAX(Answer) FOR Question in (Vault, Container)) as p; 

EDIT: Для того, чтобы продемонстрировать, что означает, что синтаксис, см следующую разбивку:

PIVOT (<aggregate function>(<column being aggregated>) 
FOR <column that contains the values that will become column headers> 
    IN ([first pivoted column], [second pivoted column]) 
+0

Я не понимаю эту часть: 'MAX (Answer) ЗА ВОПРОС в (Vault, Container)' –

+0

+1 для правильного ответа с WAY меньше строк кода. –

+0

@JoshStodola - это то, что вы на самом деле вращаете, синтаксис 'PIVOT'. Я отредактировал свой ответ, чтобы предоставить синтаксическую разбивку для 'PIVOT' для лучшего понимания :) – mattytommo

2

Вы можете сделать это с помощью Static Pivot:

create table temp 
(
    id int, 
    name varchar(10), 
    question varchar(10), 
    answer varchar(10) 
) 

INSERT into temp VALUES (0,'test', 'vault','a'); 
INSERT into temp VALUES (0,'test', 'Container','1'); 
INSERT into temp VALUES (1,'foo', 'vault','b'); 
INSERT into temp VALUES (1,'foo', 'Container','2'); 

select * 
from 
(
    select id, name, question, answer 
    from temp 
) x 
pivot 
(
    max(answer) 
    for question in ([container], [vault]) 
) p 

drop table temp 

или динамический шарнир

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
      FROM temp c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, name, ' + @cols + ' from 
      (
       select id, name, question, answer 
       from temp 
      ) x 
      pivot 
      (
       max(answer) 
       for question in (' + @cols + ') 
      ) p ' 


execute(@query) 

и даст вам те же результаты:

enter image description here

+0

+1 Большое спасибо за помощь! Интересно видеть и динамический подход. –