仅仅因为您的表中有文本数据并不意味着您不能在其上使用聚合函数。
您没有指定您所使用的RDBMS,但这种类型的数据转化为一个 支点 。这会将行数据转换为列。某些数据库具有枢轴功能,但是如果您使用的是不带枢轴功能的数据库,那么您将需要使用带有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 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 |