jjzjj

sql-server - 用于 XML 路径分组的 TSQL

coder 2024-07-04 原文

我在尝试对我的结果进行分组/嵌套时遇到问题,如下所示。

如有任何帮助,我们将不胜感激。

必需的 XML 输出

<WorkflowLog>
  <Process id="Type1">
    <ProcessInstance id="M11111">
      <AuditTrailEntry>
        <Data>
          <Attribute name="TypeSubCause">EMB</Attribute>
        </Data>
        <WorkflowModelElement>C_Created</WorkflowModelElement>
        <EventType>Start</EventType>
        <TimeStamp>2013-10-02T10:00:33</TimeStamp>
        <Originator>C_Team</Originator>
      </AuditTrailEntry>
      <AuditTrailEntry>
        <Data>
          <Attribute name="TypeSubCause">EMB</Attribute>
        </Data>
        <WorkflowModelElement>ITPSPotential</WorkflowModelElement>
        <EventType>Start</EventType>
        <TimeStamp>2013-10-03T09:15:32+10.00</TimeStamp>
        <Originator>R_Team</Originator>
      </AuditTrailEntry>
    </ProcessInstance>
  </Process>
</WorkflowLog>

我的 SQL 的实际 XML 输出 Process Id 和 ProcessInstance ID 多次显示同一 Id 的

<WorkflowLog>
  <Process id="Type1">
    <ProcessInstance id="M11111">
      <AuditTrailEntry>
        <Data>
          <Attribute name="TypeSubCause">EMBt</Attribute>
        </Data>
        <WorkflowModelElement>c_Created</WorkflowModelElement>
        <EventType>Start</EventType>
        <TimeStamp>2013-10-02T10:00:33+10.00</TimeStamp>
        <Originator>C_Team</Originator>
      </AuditTrailEntry>
    </ProcessInstance>
  </Process>
  <Process id="Type1">
    <ProcessInstance id="M11111">
      <AuditTrailEntry>
        <Data>
          <Attribute name="TypeSubCause">EMB</Attribute>
        </Data>
        <WorkflowModelElement>ITPSPotential</WorkflowModelElement>
        <EventType>Start</EventType>
        <TimeStamp>2013-10-03T09:15:32+10.00</TimeStamp>
        <Originator>R_Team</Originator>
      </AuditTrailEntry>
    </ProcessInstance>
  </Process>
</WorkflowLog>

生成这个的 SQL 是

SELECT  '@id' = m1.TypeCause ,
        ( SELECT    '@id' = m2.MTypeNumber ,
                    ( SELECT    'TypeSubCause' AS [Data/Attribute/@name] ,
                                m3.[TypeSubCause] AS [Data/Attribute/*] ,
                                m3.[Subject] AS [WorkflowModelElement] ,
                                'Start' AS [EventType] ,
                                m3.[date] AS [TimeStamp] ,
                                m3.[AssignedGroup] AS [Originator]
                      FROM      #CombinedDataSets M3
                      WHERE     m3.TypeCause = 'C_Only'
                                AND m2.MTypeNumber = m3.MTypeNumber
                                AND m2.Subject = m3.Subject
                                AND m2.date = m3.date
                    FOR
                      XML PATH('AuditTrailEntry') ,
                          TYPE
                    )
          FROM      #CombinedDataSets m2
          WHERE     m2.TypeCause = 'C_Only'
                    AND m1.MTypeNumber = m2.MTypeNumber
                    AND m1.Subject = m2.Subject
                    AND m1.date = m2.date
        FOR
          XML PATH('ProcessInstance') ,
              TYPE
        )
FROM    #CombinedDataSets m1
WHERE   m1.TypeCause = 'C_Only'
ORDER BY m1.TypeCause ,
        m1.MTypeNumber ,
        m1.date
FOR     XML PATH('Process') ,
            ROOT('WorkflowLog')

已添加 - 示例数据

CREATE TABLE #CombinedDataSets
    (
      [MTypeNumber] VARCHAR(10) ,
      subject VARCHAR(25) ,
      [Date] DATETIME ,
      [AssignedGroup] VARCHAR(25) ,
      [TypeCause] VARCHAR(25) ,
      [TypeSubCause] VARCHAR(25)
    )

INSERT  INTO #CombinedDataSets
        ( [MTypeNumber] ,
          [subject] ,
          [Date] ,
          [AssignedGroup] ,
          [TypeCause] ,
          [TypeSubCause] 
        )
        SELECT  'M11111' ,
                'C_Created' ,
                '2013-10-02 10:00:33' ,
                'CA' ,
                'C_Only' ,
                'EMB'
        UNION ALL
        SELECT  'M11111' ,
                'ITPSPotential' ,
                '2013-10-03 09:15:32' ,
                'ALLPIC' ,
                'C_Only' ,
                'EMB'

SELECT  *
FROM    #CombinedDataSets

MTypeNumber subject Date    AssignedGroup   TypeCause   TypeSubCause
M11111  C_Created   2013-10-02 10:00:33.000 CA  C_Only  EMB
M11111  ITPSPotential   2013-10-03 09:15:32.000 ALLPIC  C_Only  EMB

最佳答案

group by 添加到您的查询中:

select
    m1.TypeCause as [@id1],
    (
        select
            m2.MTypeNumber as [@id],
            (
                select 
                    'TypeSubCause' as [Data/Attribute/@name],
                    m3.[TypeSubCause] as [Data/Attribute],
                    m3.[Subject] as [WorkflowModelElement],
                   'Start' as [EventType],
                    m3.[date] as [TimeStamp],
                    m3.[AssignedGroup] as [Originator],
                from dbo.CombineDataSets as m3
                where
                    m3.LossCause = 'C_Only' and
                    m3.MTypeNumber = m2.MTypeNumber
                    m3.Subject = m2.Subject and
                    m3.date = m2.date
                for xml path('AuditTrailEntry'), type
            )
        from dbo.CombineDataSets as m2
        where
            m2.TypeCause = 'Contents Only' and
            m2.MTypeNumber = m1.MTypeNumber
            m2.Subject = m1.Subject
            m2.date = m1.date
        for xml path('ProcessInstance'), type
    )
from dbo.CombineDataSets as m1
where m1.TypeCause='C_Only'
group by m1.TypeCause, m1.date, m1.MTypeNumber, m1.Subject
order by m1.TypeCause
for xml path('Process'), root('WorkflowLog')

关于sql-server - 用于 XML 路径分组的 TSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852430/

有关sql-server - 用于 XML 路径分组的 TSQL的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  6. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  7. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  8. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  9. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  10. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

随机推荐