【问题标题】:Required pivot for below data structured以下数据结构所需的数据透视
【发布时间】:2019-03-06 05:35:00
【问题描述】:

我有以下格式的数据。

ID   question    answer
1    who         A
1    where       B
1    when        C
1    how         D

我需要如下输出

id   who   where   when   how
1    A     B       C      D

【问题讨论】:

  • 如果对您有帮助,您可以查看并接受我的回答。

标签: sql sql-server sql-server-2012 sql-server-2017


【解决方案1】:

您可以尝试使用动态数据透视查询。

create table #temp (ID int, question varchar(20), answer char(1))
insert into #temp values
(1,    'who',         'A'),
(1,    'where',       'B'),
(1,    'when',        'C'),
(1,    'how',         'D')

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

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

set @query = 'SELECT Id, ' + @cols + ' from 
            (
                select Id
                    ,question
                    , answer
                from #temp
           ) x
            pivot 
            (
                 max(answer)
                for question in (' + @cols + ')
            ) p '


execute(@query)

Live Demo

【讨论】:

  • 您好 Suraj,此查询适用于此示例,但我有许多单 ID 记录,在这种情况下我会遇到错误。选择列表中的元素数超过了允许的最大元素数 4096。
  • 我认为在这种情况下你需要提供一些过滤条件来限制记录。
【解决方案2】:

使用条件聚合

  select id, 
  max(case when question='who' then answer end) as "who",
  max(case when question='where' then answer end) as "where",
  max(case when question='when' then answer end) as "when",
  max(case when question='how' then answer end) as "how"
   from table_name
  group by id

【讨论】:

  • 我有很多关于单个 id 的问题,即超过 1000 个。如何动态获取列名?
  • 对所有问题使用此过程或更改您的数据库结构
  • @SurajKumar haha​​h 我错过了双引号谢谢,但为此你投了反对票,我认为你现在删除
  • @ZaynulAbadinTuhin 取消投票。
【解决方案3】:

你可以试试这个。

    DECLARE @column AS VARCHAR(MAX), @query  AS VARCHAR(MAX);

    SET @column = STUFF((SELECT distinct ',' + QUOTENAME(t.question) FROM table t FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')

    set @query = 'SELECT Id, ' + @column + ' from 
                (
                    select Id, question, answer from table
                ) x
                pivot 
                ( max(answer) for question in (' + @column + ')
                ) p '


    exec (@query) 

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 2022-07-21
    • 1970-01-01
    • 2015-11-30
    • 2018-10-22
    • 1970-01-01
    • 2022-11-30
    • 2013-09-14
    • 2018-04-10
    相关资源
    最近更新 更多