枢轴 Table SQL 服务器
Pivot Table SQL Server
我需要有关 sql 服务器上的枢轴 table 的帮助。
我认为returns这个结果:
但最终用户需要对结果进行一些更改,如下所示:
我做了这个查询:
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,而我只想要一行。
结果是:
我做错了什么?
你能帮帮我吗?
P.s.: 抱歉我的英语不好。 :)
结果中的 NULL
值是由于 SubCategoria
列中的空字符串。
考虑到您在 SubCategoria
列中只有一个值,而不是单个 NQuestionario
的空字符串
不要按原样选择 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)
使用简单的条件聚合在一个步骤中一致地执行所有聚合。
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)
我需要有关 sql 服务器上的枢轴 table 的帮助。
我认为returns这个结果:
但最终用户需要对结果进行一些更改,如下所示:
我做了这个查询:
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,而我只想要一行。
结果是:
我做错了什么?
你能帮帮我吗?
P.s.: 抱歉我的英语不好。 :)
NULL
值是由于 SubCategoria
列中的空字符串。
考虑到您在 SubCategoria
列中只有一个值,而不是单个 NQuestionario
不要按原样选择 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)
使用简单的条件聚合在一个步骤中一致地执行所有聚合。
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)