2012-05-04 33 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尝试:

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; 

编辑:为了证明语法意味着什么,请参阅以下故障:

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(回答)FOR(Vault,Container)' –

+0

+1对于正确的答案用WAY少一行代码。 –

+0

@JoshStodola这就是你实际上在旋转的东西,'PIVOT'的语法是。我编辑了我的答案,为“PIVOT”提供语法分析以便更好地理解:) – mattytommo

2

你可以用一个静态透视做到这一点:

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非常感谢您的帮助!有趣的是看到动态的方法。 –