【问题标题】:Pivot Dynamic Columns, no Aggregation透视动态列,无聚合
【发布时间】:2012-08-12 17:19:27
【问题描述】:

我在 SQL Server 2008 中有问卷数据,我想将其转置为矩阵。
我看到了几篇关于同一主题的帖子,但我就是不明白。

给出以下表格:

Question table

Answer table

Customer table

列数:
[CustomerID][QuestionName_1]、..、[QuestionName_n] 动态问题列数)
数据:
CustomerID, Answer_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:我不想使用具有最大列数的排名。

问候,

米歇尔

【问题讨论】:

    标签: sql-server-2008 pivot transpose


    【解决方案1】:

    是的,您可以执行动态枢轴。有时,首先使用静态版本来处理 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)
    

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

    不过,正如我所说,有时从静态版本开始会更容易,您可以先在需要转换的列中硬编码,然后再转到动态版本。

    【讨论】:

    • 在您的示例中,“选择”字段具有什么数据类型?我有一个 varchar 字段,其中包含问题的答案。
    • 这是一个varchar,如果您查看 SQL Fiddle,它将显示表结构。
    • 我已经开始使用 MIN(QuestionName)。我没想到!谢谢你的帮助蓝:)。
    • 非常感谢您的查询,它将在我身边成功执行,但我的问题是如何将列值与 DataReader 或 DataSet 绑定。请告诉我该怎么做。
    • @Harshal 您需要Ask A new Question 并包括所有相关详细信息,包括您的代码、查询等。
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多