SQL Server 数据透视表

3
我需要在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它都给了我两行,而我只想要一行。

结果如下:

enter image description here

我做错了什么?

你能帮助我吗?

附言:抱歉我的英语不好。 :)

2个回答

1

NULL值是由于SubCategoria列中的空字符串导致结果为空。

考虑到对于单个NQuestionarioSubCategoria列除空字符串外只有一个值

不要按照现有SubCategoria值选择,而是使用max([SubCategoria])over(partition by [NQuestionario])将空字符串替换为字符串值

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)

使用普通的条件聚合 .. ((SELECT distinct ', max(case pergunta when ''' + pergunta + ''' then pergunta end) as ' + QUOTENAME(pergunta) ... 而不是使用 pivot,所有的聚合都可以在单个步骤中一致地完成。 - Serg
@Serg - 动态列列表生成没有任何问题。你看了我的回答吗? - Pரதீப்
太长了,不方便注释,我会发布我的版本。 - Serg
运行正常!非常感谢您的帮助! - Pepper

0
使用简单的条件聚合在单个步骤中一致地执行所有聚合。
 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)

我需要制作一个groupby子句,但它仍然不能像它应该的那样工作。 标题是正确的,但行与标题相同。 - Pepper
分组已添加。 - Serg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接