【问题标题】:SQL Server PIVOTSQL Server 数据透视
【发布时间】:2010-11-05 15:11:11
【问题描述】:

我很确定我可以使用 PIVOT 功能来解决我的问题,但我就是想不通。任何帮助将不胜感激。

所以我有一张看起来像的桌子

create table Answer (
id int,
question_id int,
user_id int,
answer varchar(1025))

我想编写一个返回结果集的查询:

用户 ID、问题_1、问题_2、问题_3 1、“答案 1”、“答案 2”、“答案 3” 2、“答案 1”、“答案 2”、“答案 3” n,“答案 1”,“答案 2”,“答案 3”

这可能吗?

TIA

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    在您的表格中假设此输入:

    insert into answer SELECT 1, 1, 123, 'Answer ZZZZ'
    insert into answer SELECT 2, 2, 123, 'Answer AAAA'
    insert into answer SELECT 3, 3, 123, 'Answer BBBB'
    insert into answer SELECT 4, 1, 345, 'Answer CCCC'
    insert into answer SELECT 5, 2, 345, 'Answer DDDD'
    insert into answer SELECT 6, 1, 678, 'Answer EEEE'
    insert into answer SELECT 7, 2, 678, 'Answer FFFF'
    insert into answer SELECT 8, 3, 678, 'Answer SSSS'
    insert into answer SELECT 9, 3, 999, 'Answer RRRR'
    

    你可以这样做:

    SELECT user_id, [1] as Answer1, [2] as Answer2, [3] as Answer3
        FROM (
        SELECT question_id, user_id, answer
        FROM answer) P
        PIVOT
        (
        MAX (answer)
        FOR Question_id IN ([1], [2], [3])
        ) AS pvt
    

    你会得到这个结果:

    user_id Answer1         Answer2         Answer3
    123 Answer 1        Answer AAAA      Answer BBBB
    345 Answer CCCC     Answer DDDD      NULL
    678 Answer EEEE     Answer FFFF      Answer SSSS
    999 NULL                NULL         Answer RRRR
    

    【讨论】:

    • 不客气。如果您想了解更多关于 PIVOT 的信息,请参阅我的其他答案。这是一个有用的功能,但有一些你应该知道的事情。
    【解决方案2】:

    可能吗?是的。

    想要吗?很少会遇到很多性能问题,完全在 sql 中执行此操作。一旦数据透视表中的列数超过 8 左右,性能就会完全消失。

    这是否存在法律问题?不幸的是,是的。微软以其无限的智慧为“method and system for mapping between logical data and physical data”申请了专利,于 2007 年 7 月发布

    所以,请谨慎行事。

    【讨论】:

    • 我想知道关于微软法律行为的咆哮与这个问题有什么关系。
    • @Randolph:我吐槽了专利。但是,我认为阅读本文的人应该意识到基于这种动态数据实现的一个非常真实的潜在噩梦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2015-02-20
    • 2012-02-22
    • 2014-10-16
    相关资源
    最近更新 更多