2012-08-16 95 views
5

我有SQL Server 2008中的调查问卷数据,我想转置为矩阵。
我看到了几个关于同一主题的帖子,但我只是没有摆动。枢轴动态列,无聚合

给出的是下表:

Question table

Answer table

Customer table

列:
[CustomerID][QuestionName_1],..,[QuestionName_n] < - 动态问题列数)
的数据:
CustomerIDAnswer_1,..,Answer_n

检索的列中的代码:

DECLARE @columns VARCHAR(8000) 

SELECT @columns = COALESCE(@columns + ',[' + cast(QuestionName as varchar) + ']', 
'[' + cast(QuestionName as varchar)+ ']') 
FROM Answer A 
INNER JOIN Question Q ON A.QuestionID = Q.QuestionID 
INNER JOIN Customer C ON A.CustomerID = C.CustomerID 
GROUP BY Q.QuestionName 

SET @columns = '[CustomerID],' + @columns 

DECLARE @query VARCHAR(8000) 
SET @query = 'Some PIVOT query without aggregation' 

EXECUTE(@query) 

初始查询想法是从取pivots with dynamic columns

可以这样做,并且枢轴查询会是什么样子?
ps:我不想使用具有最大列数的排名。

问候,

米歇尔

回答

15

是的,你可以执行动态支点。有时,使用静态版本首先处理PIVOT查询更容易,因此您可以查看查询和结果将如何显示。然后将查询转换为动态版本。

下面是一个查询的静态与动态版为例:

静态(SQL Fiddle):

select * 
from 
(
    select u.userid, 
     u.fname, 
     u.lname, 
     u.mobile, 
     r.question, 
     r.choice 
    from users u 
    left join results r 
     on u.questionid = r.questionid 
     and u.choiceid = r.choiceid 
) x 
pivot 
(
    min(choice) 
    for question in([are you], [from]) 
) p 

动态(SQL Fiddle):

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
      FROM results c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
      (
       select u.userid, 
        u.fname, 
        u.lname, 
        u.mobile, 
        r.question, 
        r.choice 
       from users u 
       left join results r 
        on u.questionid = r.questionid 
        and u.choiceid = r.choiceid 
      ) x 
      pivot 
      (
       min(choice) 
       for question in (' + @cols + ') 
      ) p ' 


execute(@query) 

如果可以的话提供有关当前表结构的更多详细信息,然后提供一些示例数据。我们应该能够帮助您创建您的情况所需的版本。

正如我所说的,有时候从静态版本开始比较容易,在静态版本中,您需要首先转换的列中进行硬编码,然后转到动态版本。

+0

在你的例子中,'choice'字段有什么数据类型?我有一个varchar字段,其中包含问题的答案。 – 2012-08-16 11:29:51

+0

这是一个'varchar',如果你看SQL提琴它将显示表结构。 – Taryn 2012-08-16 11:31:07

+0

我有它的工作,与MIN(QuestionName)。我并不期待那样! 感谢您的帮助蓝色:)。 – 2012-08-16 12:19:15