4

我一直在查看 StackOverflow 问题,但还没有真正找到解决这个问题的问题。

我有一张桌子,基本上安排如下:

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

我正在尝试旋转表格,以便我可以获得相关联的行 ID 并使传播函数成为问题所以它看起来像

行号 | 问题 1 | 问题 2 | ETC...

| 答案 1 | 答案 2 | ETC...

我看过这个https://stackoverflow.com/a/7744347/839330除了这似乎更多地参考了一些 VB 代码(也许我错了?)。有谁知道我应该如何处理这个问题?

4

1 回答 1

9

仅仅因为您的表中有文本数据并不意味着您不能对其使用聚合函数。

您没有指定您使用的是什么 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 |
于 2013-01-17T21:18:05.880 回答