gpt4 book ai didi

sql - 透视带有文本且无聚合的表

转载 作者:行者123 更新时间:2023-12-04 20:56:42 25 4
gpt4 key购买 nike

我一直在查看 StackOverflow 问题,但还没有真正找到解决这个问题的问题。

我有一张 table ,基本上是这样安排的:

Table.LineID
Table.QuestionGroup
Table.Question
Table.Answer

我想“旋转”表格,但问题和答案没有任何可聚合的内容。例如,它们都只是文本字段,人们可能会读到:
Table.LineID = 00001
Table.QuestionGroup = Color
Table.Question = Outside Color
Table.Answer = Dark Green

Table.LineID = 00001
Table.QuestionGroup = Size
Table.Question = Height
Table.Answer = 180 3/4

我正在尝试旋转表格,以便我可以获得行的关联 ID 并使传播函数成为问题 所以它看起来像

行号 |问题 1 |问题 2 |等等...

|答案 1 |答案 2 |等等...

我看过这个 https://stackoverflow.com/a/7744347/839330除了这似乎更多地引用了一些 VB 代码(也许我错了?)。有没有人知道我应该如何处理这个问题?

最佳答案

仅仅因为您的表中有文本数据并不意味着您不能对其使用聚合函数。

您没有指定您使用的是什么 RDBMS,但这种类型的数据转换是一个枢纽。这会将行数据转换为列。一些数据库有一个枢轴函数,但如果你使用一个没有该函数的数据库,那么你将需要使用一个带有 CASE 的聚合函数。表达:

select lineid,
max(case when question ='Height' then answer else '' end) Height,
max(case when question ='Outside Color' then answer else '' end) [Outside Color]
from yourtable
group by lineid

SQL Fiddle with Demo

如果您有一个具有数据透视功能的数据库(SQL Server 2005+/Oracle 11g+),那么您的代码将类似于:
select *
from
(
select lineid,
Question,
Answer
from yourtable
) src
pivot
(
max(answer)
for question in ([Height], [Outside Color])
) piv;

SQL Fiddle with Demo

现在,如果您使用的是 SQL Server 2005+ 并且您有未知数量的问题要转换为列,那么您可以使用类似于以下内容的动态 sql:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

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

set @query = 'SELECT lineid,' + @cols + ' from
(
select lineid,
Question,
Answer
from yourtable
) x
pivot
(
max(Answer)
for Question in (' + @cols + ')
) p '

execute(@query)

SQL Fiddle with demo

根据您的样本数据,结果是:
| LINEID |  HEIGHT | OUTSIDE COLOR |
------------------------------------
| 1 | 180 3/4 | Dark Green |

关于sql - 透视带有文本且无聚合的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14388041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com