3

PIVOT はこれを達成するのに役立つと思いますが、何も開始できません。私は今日、深刻な SQL 脳のおならを抱えています。助けが必要です。

これが私が今持っている出力です:

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/名前ごとに 1 行に抑える必要があります。私はこれらのいずれかを行う方法を思い出せません!

4

3 に答える 3

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;

ここに画像の説明を入力

于 2012-05-04T19:43:21.643 に答える
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;

編集:その構文の意味を示すには、次の内訳を参照してください。

PIVOT (<aggregate function>(<column being aggregated>) 
FOR <column that contains the values that will become column headers>
    IN ( [first pivoted column], [second pivoted column])
于 2012-05-04T19:47:50.170 に答える
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)

どちらも同じ結果になります。

ここに画像の説明を入力

于 2012-05-04T19:51:32.430 に答える