繁体   English   中英

SQL 服务器动态透视 - 不使用 Pivot 带计数

[英]SQL Server Dynamic Pivoting - Not Usal Pivot With Count

我需要 Pivot 问题及其答案。pivot 查询的所需 Output 如下所示,表结构也如下所示。 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

我在这里创建了 SQL 小提琴Sql 小提琴 我看到了许多 pivot 的计数示例,但找不到与此类似的内容。

declare @sqlstring as varchar(max) = '';
SELECT
   @sqlstring = STUFF((
   SELECT distinct
      ',' + '[' + isnull(sq.Question, '''') + ']' 
   from
      @surveyanswers sa 
      join
         @SurveyQuestion sq 
         on sq.ID = sa.SurveyQuestionID 
      join
         @survey sv 
         on sv.SurveyMasterID = sq.SurveyMasterID FOR XML PATH('')), 1, 1, '')          
         select
            sa.SurveyID,
            sv.SubmittedBy,
            sq.Question,
            sa.Answer into ##temp 
         from
            @surveyanswers sa 
            join
               @SurveyQuestion sq 
               on sq.ID = sa.SurveyQuestionID 
            join
               @survey sv 
               on sv.SurveyMasterID = sq.SurveyMasterID 
         set
            @sqlstring = 'SELECT  SurveyID,SubmittedBy,' + @sqlstring + '  FROM   (select * from  ##temp ) t ' + ' PIVOT ( ' + ' max(Answer)  FOR Question IN (' + @sqlstring + ' ) ) AS pivot_table' execute(@sqlstring);

结果: 在此处输入图像描述

您只需要一些连接来获取基础数据和动态pivot以显示所需格式的结果。

尝试以下操作:

drop table if exists #temp

--base table with all details
select s.ID SurveyID, s.SubmittedBy, sq.Question, sa.Answer
into #temp
from @Survey s
join @SurveyMaster sm on sm.ID = s.SurveyMasterID
join @SurveyQuestion sq on sq.SurveyMasterID = s.SurveyMasterID
join @SurveyAnswers sa on sa.SurveyQuestionID = sq.ID and sa.SurveyID = s.ID

--dynamic pivot
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Question) 
            FROM #temp c
            ORDER BY 1 DESC
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT SurveyID, SubmittedBy, ' + @cols + ' from 
            (
                select SurveyID, SubmittedBy, Question, Answer
                from #temp
            ) x
            pivot 
            (
                max(Answer)
                for Question in (' + @cols + ')
            ) p '

--execution
execute(@query)

请在此处找到 db<>fiddle。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM