【问题标题】:Transpose xml rows to column using xpath使用 xpath 将 xml 行转置为列
【发布时间】:2017-03-21 06:19:30
【问题描述】:

我有一列作为 xml 数据类型的 SQL 表。下面是我如何将 xml 存储在该 xml 数据类型字段中(下面给出了示例两行)

<Root>
  <Element Week="201701">
        <Quantity>10</Quantity>
  </Element>
  <Element Week="201702">
        <Quantity>20</Quantity>
  </Element>
  <Element Week="201703">
        <Quantity>30</Quantity>
  </Element>
  <Element Week="201704">
        <Quantity>40</Quantity>
  </Element>
  <Element Week="201705">
        <Quantity>50</Quantity>
  </Element>
</Root>

<Root>
  <Element Week="201701">
        <Quantity>60</Quantity>
  </Element>
  <Element Week="201702">
        <Quantity>70</Quantity>
  </Element>
  <Element Week="201703">
        <Quantity>80</Quantity>
  </Element>
  <Element Week="201704">
        <Quantity>90</Quantity>
  </Element>
  <Element Week="201705">
        <Quantity>100</Quantity>
  </Element>
</Root>

注意:有数百万行。每一行都有一个带有此 xml 的字段

现在,当我从

中读取(仅两行)
PDI PNO PCO PCT NKT MKI DEL Root
A1C 13D A1  W2  0C1 A10 22A <Root><ElementWeek="201701"> <Quantity>10</Quantity></Element><ElementWeek="201702"> <Quantity>20</Quantity></Element><ElementWeek="201703"> <Quantity>30</Quantity></Element><ElementWeek="201704"> <Quantity>40</Quantity></Element><ElementWeek="201705"> <Quantity>50</Quantity></Element></Root>
A2C 14D Z1  W2  061 A10 22A <Root><ElementWeek="201701"> <Quantity>60</Quantity></Element><ElementWeek="201702"> <Quantity>70</Quantity></Element><ElementWeek="201703"> <Quantity>80</Quantity></Element><ElementWeek="201704"> <Quantity>90</Quantity></Element><ElementWeek="201705"> <Quantity>100</Quantity></Element></Root>

我想提取 xml 字段,下面是我的预期结果。有了这个,我将数据绑定到 PF 网格比 JSON 存储和循环每个元素的方式要快得多

预期结果:我的元素节点应该是列标题,文本节点应该是元素节点的数据。还有表现如何?

PDI PNO PCO PCT NKT MKI DEL 201701  201702  201703  201704  201705
A1C 13D A1  W2  0C1 A10 22A   10      20      30      40      50
A2C 14D Z1  W2  061 A10 22A   60      70      80      90      100

【问题讨论】:

  • 这是什么风格的 SQL? SQL Server,不是吗?
  • 201701201705 的值是固定的还是这些只是示例?这看起来像 year-month...您需要通用方法吗?
  • 你好 har07:现在我们正在使用 SQL Express 2016 版本来尝试之前的许可版本
  • 你好 Shnugo:你说得对,我应该提到它。它们是年和周列(一年中 52 周,最多 2 到 3 年的数据将与相应的周数一起存储)。它们是完全动态的列。由于每个下周,前一周都会从主表中删除。此外,用户必须能够以自定义方式选择周列。例如,用户只能选择 201701 201710 和 201750 三个。那么只有三列必须以相应的数量动态出现在列中。
  • 您需要一个数据透视表。为了帮助需要带有标题列 PDI、PNO、PCO、PCT、NKT、MKI 和 DEL 的 xml 文件的一小部分

标签: c# sql .net xml xpath


【解决方案1】:

您可以使用 XML 方法 value() 传递 XPath/XQuery 表达式,该表达式一次返回一个目标元素,例如:

SELECT 
    t.MyXmlColumn.value('(/Root/Element[@Week="201701"]/Quantity)[1]', 'int') AS 201701,
    t.MyXmlColumn.value('(/Root/Element[@Week="201702"]/Quantity)[1]', 'int') AS 201702,
    ....
FROM MyTable t

【讨论】:

  • 您好 har07:感谢您的回复。但有一件事,该解决方案着眼于 nvarchar 类型的数据类型。不是吗?实际上我们的数据类型是xml。你能告诉我们你的意见吗
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 2016-10-18
  • 2019-02-22
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多