2016-08-26 14 views
3

SQL Server上でピボットテーブルのヘルプが必要です。ピボットテーブルSQL Server

私はこの結果を返すビューを持っている:

enter image description here

しかし、エンドユーザーがこのようになり、その結果にいくつかの変更が必要になります。

enter image description here

私はこれを作りましたクエリ:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(pergunta) 
       from [dbo].[VRespostas] 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

    set @cols2 = '[NQuestionario],[Data],[Utilizador],' + @cols + ',[SubCategoria],[Observacoes]' 

    print @cols + ' '+ @cols2 

    set @query = 'SELECT ' + @cols2 + ' from 
     (
      select * 
      from [dbo].[VRespostas] 
     ) x 
     pivot 
     (
      max(Resposta) 
      for Pergunta in (' + @cols + ') 
     ) p ' 

    execute(@query) 

結果はほとんど私が欲しいものですが、それは任意のIDの2行を私に与えてくれるので、私は1行だけを必要とします。

結果は次のとおりです。

enter image description here

私が間違ってやってきましたか?

私を助けてもらえますか?

P .:私の悪い英語のために申し訳ありません。 :)

答えて

1

NULL結果の値は、空の文字列SubCategoriaの列のためです。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(pergunta) 
       from [dbo].[VRespostas] 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 
set @cols2 = '[NQuestionario],[Data],[Utilizador],' + @cols + ',[SubCategoria],[Observacoes]' 

print @cols + ' '+ @cols2 

set @query = 'SELECT ' + @cols2 + ' from 
    (
     select [NQuestionario],[Data],[Utilizador],[Observacoes],pergunta 
     ,max([SubCategoria])over(partition by [NQuestionario]) as [SubCategoria] --Here 
     from [dbo].[VRespostas] 
    ) x 
    pivot 
    (
     max(Resposta) 
     for Pergunta in (' + @cols + ') 
    ) p ' 

execute(@query) 
+0

すべての集計を1つのステップで一貫して行うことができます – Serg

+0

@Serg - 動的列リストの生成に間違いはありません。私の回答をお読みください –

+0

コメントが長すぎると、私のバージョンが投稿されます。 – Serg

0
文字列値を空の文字列を置き換えるために max([SubCategoria])over(partition by [NQuestionario])を使用し、あなたが代わりにそれがあるとして SubCategoria値を選択する単一 NQuestionario

に空の文字列以外のSubCategoriaの列の値を一つだけ持って考えます

プレーンな条件付き集計を使用して、すべての集計を一貫して一度に実行します。 ... + QUOTENAME(pergunta) 'としてエンドpergunta次いで')普通条件集合 `..((異なるSELECT 'MAX(ケースpergunta ' '' を' + pergunta +' を使用`の代わりに

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

select @cols = (
    select distinct ', max(case pergunta when ''' + pergunta + ''' then pergunta end) as ' + QUOTENAME(pergunta) 
    from [dbo].[VRespostas] 
    FOR XML PATH('')) 

set @query = 'SELECT [NQuestionario],[Data],[Utilizador]' + @cols + ' max([SubCategoria]) as [SubCategoria], max([Observacoes]) as [Observacoes] 
from [dbo].[VRespostas] 
group by [NQuestionario],[Data],[Utilizador]' 


execute(@query) 
+0

私はgroupby句を作成する必要がありますが、まだ動作していません。 ヘッダーは問題ありませんが、行はヘッダから同じです。 – Pepper

+0

グループが追加されました。 – Serg