在 1 行中创建相同列的数据透视
Posted
技术标签:
【中文标题】在 1 行中创建相同列的数据透视【英文标题】:Create a pivot of same columns in to 1 row 【发布时间】:2021-05-30 20:00:07 【问题描述】:我使用的是SQL Server,我有一个查询返回所有字段的数据,主要是1个字段可以属于多条记录,记录ID区分它们。
我有一个这样的数据集。
This is my current data set
我当前的查询:
Select fd.FieldName ,FV.FieldID, Data , R.RecordID from FieldValues FV
Inner Join Records R on R.RecordID = FV.RecordID
Inner Join Forms F On f.FormID = R.FormID
Inner join Fields fd on fd.FieldID = fv.FieldID
Where R.RecordID IN (45,46)
我需要像这样创建属于同一 RecordID 的每一列的 1 行。
Service Name Location city VendorCode RecordID
Raj ABC LOCATION ABC CITY 32 45
BEN ABC LOCATION ABC CITY -- 46
以上是我想要的输出。
我尝试过使用 pivot 但没有成功。
【问题讨论】:
你的尝试是什么?你忘了包括它。但是,理想情况下,修复您的设计;这种类型的设计在 RDBMS 中很少工作或表现良好。 我的项目中有很多表单,所以我用动态表单创建了它 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 那你需要写很多动态SQL @FaizanNaeem。我怀疑您是否想这样做,就好像您知道该怎么做一样,您就不会问自己的问题。修复您的设计并使用标准化方法。 【参考方案1】:如果您不喜欢处理动态pivot
并且您知道要转换为列的行的键,则可以使用标准sql 与max
和case when
select
max(case fd.FieldName when 'SelectService' then Data else null end) as ServiceName,
max(case fd.FieldName when 'EnterYourLocation' then Data else null end) as Location,
max(case fd.FieldName when 'City' then Data else null end) as city,
max(case fd.FieldName when 'VendorCodeOption' then Data else null end) as VendorCode,
R.RecordId
from FieldValues FV
Inner Join Records R on R.RecordID = FV.RecordID
Inner Join Forms F On f.FormID = R.FormID
Inner join Fields fd on fd.FieldID = fv.FieldID
where R.RecordID IN (45,46)
group by R.RecordId
【讨论】:
这是满足要求但不是动态的,因为我有很多字段,所以我需要为所有这些字段创建条件? 我担心使用带有简单 sql 的 sql server 是不可能的。您需要动态构建查询,以便在第一阶段获取所有键。【参考方案2】:这是带有枢轴的解决方案,但缺少包含调整连接
declare @columns varchar(max) set @columns = ''
select @columns = coalesce(@columns + '[' + cast(col as varchar(MAX)) + '],', '')
FROM ( select FieldName as col from FieldValues group by FieldName ) m
set @columns = left(@columns,LEN(@columns)-1)
DECLARE @SQLString nvarchar(max);
set @SQLString = '
select * from
( select RecordId, FieldName, Data from FieldValues) m
PIVOT
( MAX(Data)
FOR FieldName in (' + @columns + ')
) AS PVT'
EXECUTE sp_executesql @SQLString
【讨论】:
以上是关于在 1 行中创建相同列的数据透视的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PySpark ML 中创建自定义 SQLTransformer 以透视数据