我一直在研究问题,但还没有真正找到这个问题。
我有一个基本上像这样排列的表:
Table.LineID Table.QuestionGroup Table.Question Table.Answer
我想“透视”表,但是问题和答案没有任何要汇总的内容。例如,它们全都是文本字段,可能显示为:
Table.LineID = 00001 Table.QuestionGroup = Color Table.Question = Outside Color Table.Answer = Dark Green Table.LineID = 00001 Table.QuestionGroup = Size Table.Question = Height Table.Answer = 180 3/4
我正在尝试旋转表,以便我可以获取相关的line ID,并使散布函数成为Questions,因此它看起来像
LineID | 问题1 | 问题2 | 等等…
| 答案1 | 答案2 | 等等…
仅仅因为您的表中有文本数据并不意味着您不能在其上使用聚合函数。
您没有指定您所使用的RDBMS,但这种类型的数据转化为一个 支点 。这会将行数据转换为列。某些数据库具有枢轴功能,但是如果您使用的是不带枢轴功能的数据库,那么您将需要使用带有CASE表达式的聚合函数:
CASE
select lineid, max(case when question ='Height' then answer else '' end) Height, max(case when question ='Outside Color' then answer else '' end) [Outside Color] from yourtable group by lineid
参见带有演示的SQL Fiddle
如果您有一个具有数据透视功能的数据库(SQL Server 2005 + / Oracle 11g +),那么您的代码将类似于以下内容:
select * from ( select lineid, Question, Answer from yourtable ) src pivot ( max(answer) for question in ([Height], [Outside Color]) ) piv;
现在,如果您使用的是SQL Server 2005+,并且有许多未知的问题要转换为列,那么可以使用类似于以下内容的动态sql:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Question) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT lineid,' + @cols + ' from ( select lineid, Question, Answer from yourtable ) x pivot ( max(Answer) for Question in (' + @cols + ') ) p ' execute(@query)
根据您的样本数据,结果为:
| LINEID | HEIGHT | OUTSIDE COLOR | ------------------------------------ | 1 | 180 3/4 | Dark Green |