Sev*_*eed 3 sql pivot pivot-table
我一直在查看StackOverflow问题,并没有真正找到这个问题.
我有一张桌子基本上安排如下:
Table.LineID
Table.QuestionGroup
Table.Question
Table.Answer
Run Code Online (Sandbox Code Playgroud)
我想"转动"表格,但问题和答案没有任何可聚合的东西.例如,它们都只是文本字段,有人可能会读到:
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
Run Code Online (Sandbox Code Playgroud)
我正在尝试转动表格,以便我可以获得行的关联ID并使扩散函数成为问题所以它看起来像
LineID | 问题1 | 问题2 | 等等...
| 答案1 | 答案2 | 等等...我看过这个/sf/answers/542104321/,除了这似乎更多的是参考一些VB代码(也许我错了?).有没有人知道如何处理这个问题?
仅仅因为你的表中有文本数据并不意味着你不能在它上面使用聚合函数.
您没有指定您正在使用的RDBMS,但这种类型的数据转换是一个支点.这会将行数据转换为列.某些数据库具有pivot函数,但如果您使用的是没有该函数的数据库,那么您将需要使用带有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
Run Code Online (Sandbox Code Playgroud)
如果您有一个具有pivot功能的数据库(SQL Server 2005 +/Oracle 11g +),那么您的代码将类似于:
select *
from
(
select lineid,
Question,
Answer
from yourtable
) src
pivot
(
max(answer)
for question in ([Height], [Outside Color])
) piv;
Run Code Online (Sandbox Code Playgroud)
现在,如果您使用的是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)
Run Code Online (Sandbox Code Playgroud)
根据您的示例数据,结果是:
| LINEID | HEIGHT | OUTSIDE COLOR |
------------------------------------
| 1 | 180 3/4 | Dark Green |
Run Code Online (Sandbox Code Playgroud)