我有一个包含一系列调查回复的表格,结构如下:
Question Category | Question Number | Respondent ID | Answer这似乎是最符合逻辑的数据存储。Question Number和Respondent ID的组合是独一无二的。
问题是,有人要求我提供一份以Respondent ID为列、以Answer为行的报告。由于Answer是自由文本的,因此期望数字的PIVOT命令没有帮助。如果每一行都是一个特定的Question Category / Question Number配对,这样所有信息都显示在一个表中,那就更好了。
这个是可能的吗?我猜将需要一定数量的动态SQL,特别是在预期要显示的50多个调查的情况下。
发布于 2013-01-15 09:17:38
我认为这个任务应该由你的客户端代码来完成-尝试在SQL端进行这种转置并不是一个很好的主意。这样的SQL (即使可以构造)可能会非常复杂和脆弱。
首先,你应该计算有多少不同的答案-如果所有的答案都不同,你可能不想创建1000列宽的报告。此外,你可能想要确保答案是狭窄的-如果有人给出了非常糟糕的1KB宽的答案怎么办?
然后,您应该根据标准的非转置SQL的结果动态地构造您的报告(是HTML还是其他什么)。
例如,在超文本标记语言中,您可以使用表头的<th>column</th>和数据单元格的<td>value</td>创建任意数量的列-前提是您已经知道输出结果中将有多少列。
发布于 2013-01-15 10:19:08
在我看来,问题似乎在于列数。你不知道有多少受访者。
一种想法是连接应答者ids。您可以在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(这是未经测试的,因此可能存在语法错误。)
发布于 2013-01-15 10:42:01
如果报表可以使用报告服务或excel power pivot,那么它们都可能比直接的sql查询更容易实现您想要的功能。在RS中,你可以使用tablix,在power中,你可以使用数据透视表。它们都避免了在sql pivot语句中定义透视表列,并且都可以从表格结果集中动态确定列名。
https://stackoverflow.com/questions/14329559
复制相似问题