仅仅因为您的表中有文本数据并不意味着您不能对其使用聚合函数。
您没有指定您使用的是什么 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 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 Fiddle
现在,如果您使用的是 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)
请参阅带有演示的 SQL Fiddle
根据您的样本数据,结果是:
| LINEID | HEIGHT | OUTSIDE COLOR |
------------------------------------
| 1 | 180 3/4 | Dark Green |