0

我的情况是这样的:

我有 400 名用户(行)回答 76 个问题(列)的调查。这些用户在数据库中已经有一个 ID。我创建了一个表格,其中包含每个公司的问题,每个问题都有自己的 ID。所以现在我需要将问题 ID 与每个用户 ID 的答案结合起来。

当我导入时,列标题需要是:

User ID   |  Question ID  |  Answer
xxxxxxx   | xxxxxxxxxxxxx | xxxxxxxxxx

代替:

User ID  |  Question ID 1 | Question ID 2 | Question ID 3 | etc...
xxxxxx   | xxxxx          | xxxxx         | xxxxx         | ...

感谢您提供任何和所有帮助,谢谢。

4

2 回答 2

2

听起来您想取消数据透视。根据您的 SQL Server 版本,可以通过多种方式完成此操作。

如果您使用的是 SQL Server 2005+,则可以使用将列转换为行的 UNPIVOT 函数:

select userid, questionid, answer
from yourtable
unpivot
(
  answer
  for questionId in (QuestionId1, QuestionId2)
) unpiv;

如果您使用的是 SQL Server 2008+,则可以使用 UNPIVOT 函数,但也可以使用 CROSS APPLY 和 VALUES 将数据从列转换为行:

select t.userid, c.questionid, c.answer
from yourtable t
cross apply
(
  values 
    ('QuestionId1', QuestionId1),
    ('QuestionId2', QuestionId2),
    ...
) c (questionId, answer);

然后,如果您有未知数量的列需要转换为行,那么您可以使用动态 SQL 来获取结果:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name != 'userid'
         for xml path('')), 1, 1, '')

set @query 
  = 'select userid, questionid, answer
     from yourtable
     unpivot
     (
        answer
        for questionid in ('+ @colsunpivot +')
     ) u'

exec(@query);

作为旁注,当您执行这种类型的转换时,被转换为行的列的数据必须是相同的数据类型。例如,如果 Question1 和 Question2 是不同的数据类型,那么您需要在 unpivot 之前转换它们,类似于:

select userid, questionid, answer
from
(
  select userid, 
    cast(questionid1 as varchar(10)) questionid1,
    cast(questionid2 as varchar(10)) questionid2
  from yourtable
) src
unpivot
(
  answer
  for questionId in (QuestionId1, QuestionId2)
) unpiv;
于 2013-04-15T20:25:54.287 回答
1

您可以在 MSSQL 2005 或更高版本中使用 unpivot:

SELECT [User ID], [Question ID], [Question Reponse]
FROM 
   (SELECT [User ID], [Question 1], [Question 2]
   FROM pvt) p
UNPIVOT
   ([Question Reponse] FOR [Question ID] IN 
      ([Question 1], [Question 2])
)AS unpvt;

来自:[用户 ID] int ,[问题 1] VARCHAR(100) ,[问题 2] VARCHAR(100)

结果:

| USER ID | QUESTION ID | QUESTION REPONSE |
--------------------------------------------
|       1 |  Question 1 |             Blah |
|       1 |  Question 2 |         BlahBlah |
|       2 |  Question 1 |         MoreBlah |
|       3 |  Question 1 |      No Response |
|       3 |  Question 2 |             Else |

SQL小提琴

于 2013-04-15T20:36:54.230 回答