值为文本时转置SQL表

时间:2013-01-15 01:02:16

标签: sql sql-server transpose

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

Question Category | Question Number | Respondent ID | Answer

这似乎是数据最合理的存储空间。 Question CategoryQuestion NumberRespondent ID的组合是唯一的。

问题是,我被要求提供一个以Respondent ID为列的报告,其中Answer为行。由于Answer是自由文本,因此数字期望PIVOT命令无效。如果每一行都是特定的Question Category / Question Number配对,那么所有信息都会显示在一个表格中。

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

3 个答案:

答案 0 :(得分:0)

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

首先,您应该计算出有多少不同的答案 - 如果所有答案都不同,您可能不想创建1000列的报告。另外,你可能想确保答案很窄 - 如果有人给出了非常糟糕的1KB答案呢?

然后,您应该根据标准的非转置SQL的结果动态构建报表(将是HTML或其他内容)。

例如,在HTML中,您可以根据需要使用<th>column</th>创建表头,为数据单元创建<td>value</td> - 只要您知道将有多少列你的输出结果。

答案 1 :(得分:0)

对我而言,问题似乎是列数。你不知道有多少受访者。

一个想法是连接受访者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

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

答案 2 :(得分:0)

如果报告服务或excel power pivot是报告的可能性,那么它们可能比直接的SQL查询更容易完成您想要的任务。在RS中,您可以使用Tablix,并在电源中旋转数据透视表。两者都避免必须在sql pivot语句中定义透视列,并且两者都可以从表格结果集中动态确定列名。