值为文本时转置SQL表

值为文本时转置SQL表,sql,sql-server,transpose,Sql,Sql Server,Transpose,我有一个包含一系列调查回复的表格,结构如下: Question Category | Question Number | Respondent ID | Answer 这似乎是最符合逻辑的数据存储。问题类别、问题编号和受访者ID的组合是唯一的 问题是,我被要求提交一份报告,其中列是受访者ID,行是答案。由于Answer是自由文本,因此PIVOT命令没有帮助。如果每一行都是特定的问题类别/问题编号配对,这样所有信息都显示在一个表中,那就太好了 这可能吗?我猜需要一定数量的动态SQL,尤其是预期要

我有一个包含一系列调查回复的表格,结构如下:

Question Category | Question Number | Respondent ID | Answer
这似乎是最符合逻辑的数据存储。
问题类别
问题编号
受访者ID
的组合是唯一的

问题是,我被要求提交一份报告,其中列是
受访者ID
,行是
答案。由于
Answer
是自由文本,因此
PIVOT
命令没有帮助。如果每一行都是特定的
问题类别
/
问题编号
配对,这样所有信息都显示在一个表中,那就太好了


这可能吗?我猜需要一定数量的动态SQL,尤其是预期要显示的50多个调查。

我认为这项任务应该由您的客户机代码完成-尝试在SQL端进行这种转换不是一个好主意。这样的SQL(即使可以构造)可能非常复杂和脆弱

首先,您应该计算有多少不同的答案-如果所有答案都不同,您可能不想创建1000列宽的报告。此外,您可能希望确保答案是狭窄的——如果有人给出了1KB宽的答案,那该怎么办

然后,您应该根据标准的、未转换的SQL的结果动态地构造报表(可能是HTML或其他内容)


例如,在HTML中,您可以使用
column
作为表头,使用
value
作为数据单元格,创建任意数量的列—只要您已经知道输出结果中将包含多少列。

对我来说,问题似乎在于列的数量。你不知道有多少受访者

一个想法是连接响应ID。您可以在SQL Server中通过以下方式执行此操作:

select distinct Answer,
       (select cast(RespondentId as varchar(255))+'; '
        from Responses r2
        where r2.Answer = r.Answer
        for xml path ('')
       ) AllResponders
from Responses r

(这是未经测试的,因此可能有语法错误。)

如果reporting services或excel power pivot是报表的可能选项,那么它们可能都比直接的sql查询更容易完成您想要的任务。在RS中,您可以使用tablix,在power pivot中,您可以使用pivot表。两者都可以避免在sql pivot语句中定义透视列,并且都可以从表格结果集中动态确定列名。

您可以发布一些示例数据和所需结果吗?
PIVOT
使用聚合函数,这不限于数值。