【问题标题】:Dynamic sql pivot values coming in seperate columns不同列中的动态 sql 数据透视值
【发布时间】:2019-01-22 11:34:19
【问题描述】:

您好,我正在尝试编写动态数据透视表,因为我有 100 多列

ID   Question    Answer
1    Name        peter
1    DOB         11/12/2003
1    address     …..
1    Issue1      d
1    Issue2      a
2    Name        sam
2    DOB         10/01/1998
2    address     …..
2    Issue1      p
2    Issue2      f

我想要这样的输出:

ID    Name    DOB         address    Issue1  Issue2
1     peter   11/12/2003    ….       d        a
2     sam     10/01/1998    ….       p        f

这是我使用的代码:-

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Question) 
                from #temp
                FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = N'SELECT ID + @cols + N' 
            from #temp
        pivot 
        (
            max([answer])
            for Question in (' + @cols + N')
        ) p '

exec sp_executesql @query;

但我在单独的一行中得到每个答案。我希望一个 ID 的所有答案都排成一行。有人可以帮助我。感谢您在这方面的时间。谢谢。

我得到这样的输出,这不是我想要的。我想要上面的输出。

ID    Name    DOB       address Issue1    Issue2
1     Peter             
1            11/12/2003         
1                       …       
1                               d   
1                                        a

【问题讨论】:

  • “我希望一个 ID 的所有答案都在一个列中”。我不明白。您想要的结果有多个列。
  • 您使用的是哪个 dbms? (该代码是特定于产品的。)
  • 嗨,戈登,我已经用我得到的输出编辑了我上面的帖子。我正在使用 Sql 2008
  • 抱歉,我输入的是列而不是行。我想要一行中每个 id 的所有答案。我在不同的行中得到每个答案。任何帮助将不胜感激

标签: sql dynamic pivot entity-attribute-value


【解决方案1】:

您似乎正在寻找一种方法来根据您的表格动态创建数据透视表而不进行聚合。您可以尝试以下方法:

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Question) 
                    FROM #TEMP
                    GROUP BY QUESTION
                    ORDER BY QUESTION
            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);

预期输出:

+----+---------+------------+--------+--------+-------+
| ID | address |    DOB     | Issue1 | Issue2 | Name  |
+----+---------+------------+--------+--------+-------+
|  1 | …..     | 11/12/2003 | d      | a      | peter |
|  2 | …..     | 10/1/1998  | p      | f      | sam   |
+----+---------+------------+--------+--------+-------+

【讨论】:

  • 效果很好。非常感谢@Jiggles32。但是,我现在遇到了另一个问题。对于每个有母亲姓名和父亲姓名的 ID,我都有一个名为“父母”的问题。以 max(answer) 为中心,只有一个父母的名字出现了。如何获得 2 个名称或 2 个用逗号分隔的名称很好。请帮忙。非常感谢。
  • 或者有没有办法将它们重命名为 parent1、parent2 和 2 个不同列中的名称
  • 我能想到的唯一方法是在基表中重命名它们。我能想到的唯一合理的方法是重复行重命名,如this question suggests。但是,您可能想为此主题打开另一个问题行(如果您需要更具体的帮助)。
  • 太好了。我会尝试实现它。非常感谢您的帮助@Jiggles32。
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2021-10-27
  • 2016-11-17
  • 2022-01-18
相关资源
最近更新 更多