我需要对表中的XML列执行数据透视,其中XML包含具有多个属性的多个元素。每个元素中的属性始终相同,但是元素的数量会有所不同。让我举个例子吧…
FormEntryId | FormXML | DateCreated
====================================================================================
1 |<Root> | 10/15/2009
| <Form> |
| <FormData FieldName="Username" FieldValue="stevem" /> |
| <FormData FieldName="FirstName" FieldValue="Steve" /> |
| <FormData FieldName="LastName" FieldValue="Mesa" /> |
| </Form> |
|</Root> |
| |
------------------------------------------------------------------------------------
2 |<Root> | 10/16/2009
| <Form> |
| <FormData FieldName="Username" FieldValue="bobs" /> |
| <FormData FieldName="FirstName" FieldValue="Bob" /> |
| <FormData FieldName="LastName" FieldValue="Suggs" /> |
| <FormData FieldName="NewField" FieldValue="test" /> |
| </Form> |
|</Root> |
我需要为每个不同的FieldName属性值(在此示例中为Username,FirstName,LastName和NewField)使用相应的FieldValue属性作为值的结果集结束。我上面给出的示例的结果如下所示:
FormEntryId | Username | FirstName | LastName | NewField | DateCreated
======================================================================
1 | stevem | Steve | Mesa | NULL | 10/15/2009
----------------------------------------------------------------------
2 | bobs | Bob | Suggs | test | 10/16/2009
我想出了一种使用静态列来完成此操作的方法
SELECT
FormEntryId,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="Username"][1]/@FieldValue','varchar(max)') AS Username,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="FirstName"][1]/@FieldValue','varchar(max)') AS FirstName,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="LastName"][1]/@FieldValue','varchar(max)') AS LastName,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="NewField"][1]/@FieldValue','varchar(max)') AS NewField,
DateCreated
FROM FormEntry
但是,我想看看是否有一种方法可以基于“ FieldName”属性值的不同集合来使列动态化。
看看这个动态枢纽,以及最近的这一枢纽-您基本上需要能够SELECT DISTINCT FieldName
使用此技术动态地构建查询。
这是您特定问题的完整答案(请注意,从不同属性生成列表时,如果知道列应显示的顺序,则存在列顺序弱点):
DECLARE @template AS varchar(MAX)
SET @template = 'SELECT
FormEntryId
,{@col_list}
,DateCreated
FROM FormEntry'
DECLARE @col_template AS varchar(MAX)
SET @col_template = 'FormXML.value(''/Root[1]/Form[1]/FormData[@FieldName="{FieldName}"][1]/@FieldValue'',''varchar(max)'') AS {FieldName}'
DECLARE @col_list AS varchar(MAX)
;WITH FieldNames AS (
SELECT DISTINCT FieldName
FROM FormEntry
CROSS APPLY (
SELECT X.FieldName.value('@FieldName', 'varchar(255)')
FROM FormXML.nodes('/Root[1]/Form[1]/FormData') AS X(FieldName)
) AS Y (FieldName)
)
SELECT @col_list = COALESCE(@col_list + ',', '') + REPLACE(@col_template, '{FieldName}', FieldName)
FROM FieldNames
DECLARE @sql AS varchar(MAX)
SET @sql = REPLACE(@template, '{@col_list}', @col_list)
EXEC (@sql)
问题内容: 让我们有一个示例片段: 我不知道如何更新该属性的值。 问题答案: 在这里阅读更多有关它的信息。XML数据修改语言(XML DML)
好的,我有一张像这样的桌子 现在我需要把它变成这样: 我一直在查看动态枢轴示例,但似乎我无法将它们放入我的场景中。 有人能帮忙吗?
问题内容: 我不确定这是否称为“透视”。 我的SQL 2005表 [CustromerRoles]中的数据 是这样的: [角色] 表: 我想创建一个这样的视图: SELECT * FROM [MYVIEW]将为我提供以下数据: 1和0将是位,因此我可以在UI显示屏上显示带有复选框的网格。 到目前为止,我还不知道如何去做。 问题答案: 试试这个: 经过测试。它给出您想要的相同结果。
我使用Apache Spark 2.2.0和Scala。 我以这个问题为指导,在不使用pivot函数的情况下透视数据帧。 我需要在不使用pivot函数的情况下透视数据帧,因为我有非数字数据,而< code>pivot只对数字数据使用聚合函数,如< code>sum 、< code>min 、< code>max。我想在< code>pivot聚合中使用一个非数字列。 这是我的数据: 我希望它按<
问题内容: 我有一个查询,该查询返回具有相关抵押名称的客户贷款,如以下(1)所示,但我想连续仅拥有一个不同的贷款编号,并且像其他示例(2)那样保留抵押名称。一直在进行透视,但由于我没有汇总列,也不知道要解决的原因,我也不知道每笔贷款可能没有多少抵押品。怎么做???在SQL Server 2012中可能吗? 谢谢 (1) (2)我需要这样的东西 问题答案: 测试数据 询问 结果集 动态列更新 笔记
我有两个表:Person(person_id,name)和另一个表Contacts(person_id,phone_type,phone_no)。 例如,contacts表的行被透视以形成视图的列(列的数量将根据'phone_types'列的不同值而变化)。 有什么方法可以透视contacts表,但使用动态pivot-in-sublic,类似