ВЫБРАТЬ ДЛЯ УЗЛОВ ПЕТЛИ XML С ОДНОЙ ТАБЛИЦЕЙ (tsqL) - PullRequest
2 голосов
/ 20 сентября 2011

всем, у меня просто следующая ситуация: мне нужно создать несколько документов XML из таблицы SQL, но после многих попыток у меня получится только тот результат, который не соответствует моим потребностям. Это пример таблицы, к которой я хочу обратиться:

CREATE TABLE [dbo].[CROMULTITEST02]( [idCli] [numeric](18, 0) NULL, [Name] [varchar](50) NULL, [Apepat] [varchar](50) NULL, [Apemat] [varchar](50) NULL, [CtaCtble] [numeric](18, 0) NULL, [SdoCtble] [numeric](18, 0) NULL, [Date] [datetime] NULL, [Texto] [varchar](50) NULL ) ON [PRIMARY]

INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(1 AS Numeric(18, 0)), N'Fernando', N'Fernandez', N'Ferguson', CAST(1234 AS Numeric(18, 0)), CAST(1000 AS Numeric(18, 0)), CAST(0x00009DA000000000 AS DateTime), N'Hola')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(2 AS Numeric(18, 0)), N'Gonzalo', N'Gonzales', N'Gonzaga', CAST(2345 AS Numeric(18, 0)), CAST(1344 AS Numeric(18, 0)), CAST(0x00009DDB00000000 AS DateTime), N'Hi')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(3 AS Numeric(18, 0)), N'Ramiro', N'Ramirez', N'Ramsom', CAST(3456 AS Numeric(18, 0)), CAST(2333 AS Numeric(18, 0)), CAST(0x00009DEB00000000 AS DateTime), N'Hallo')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(4 AS Numeric(18, 0)), N'Rosa', N'Rosales', N'Del Prado', CAST(4567 AS Numeric(18, 0)), CAST(5555 AS Numeric(18, 0)), CAST(0x00009FB100000000 AS DateTime), N'Hello')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(5 AS Numeric(18, 0)), N'Sancho', N'Sanchez', N'S.', CAST(5678 AS Numeric(18, 0)), CAST(6788 AS Numeric(18, 0)), CAST(0x00009ECA00000000 AS DateTime), N'Bye')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(6 AS Numeric(18, 0)), N'Martín', N'Martinez', N'Mortensen', CAST(6789 AS Numeric(18, 0)), CAST(4400 AS Numeric(18, 0)), CAST(0x00009F0600000000 AS DateTime), N'Goodbye')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(7 AS Numeric(18, 0)), N'Armando', N'Armas', N'Gunn', CAST(7890 AS Numeric(18, 0)), CAST(1200 AS Numeric(18, 0)), CAST(0x00009F7700000000 AS DateTime), N'Au Revoir')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(1 AS Numeric(18, 0)), N'Fernando', N'Fernandez', N'Ferguson', CAST(4321 AS Numeric(18, 0)), CAST(3000 AS Numeric(18, 0)), CAST(0x00009EC400000000 AS DateTime), N'Danke')
INSERT [dbo].[CROMULTITEST02] ([idCli], [Name], [Apepat], [Apemat], [CtaCtble], [SdoCtble], [Date], [Texto]) VALUES (CAST(4 AS Numeric(18, 0)), N'Rosa', N'Rosales', N'Del Prado', CAST(7654 AS Numeric(18, 0)), CAST(1560 AS Numeric(18, 0)), CAST(0x00009F3000000000 AS DateTime), NULL)

И мой sql для XML-запроса выглядит так:

SELECT CROM1.[idCli] AS '@IDCli'
,CROM1.[Name] AS 'Name'
,CROM1.[Apepat] AS 'ApePat'
,CROM1.[Apemat] AS 'ApeMat'
,(SELECT CtaCtble AS '@CtaCtable'
    ,(SELECT SdoCtble as 'SdoCtble'
        FROM [CROMULTITEST02] AS CROM3 
        WHERE CROM3.CtaCtble=CROM2.CtaCtble AND CROM3.IDCLI=CROM1.IDCLI
        FOR XML path(''), TYPE
    )FROM [CROMULTITEST02] AS CROM2
    WHERE CROM2.IDCLI=CROM1.IDCLI
    GROUP BY CROM2.CtaCtble
    FOR XML PATH('InfoCtble'), TYPE
)
FROM [CROMULTITEST02] AS CROM1
GROUP BY [idCli],[Name],[Apepat],[Apemat]
FOR XML PATH('OpCli'), ROOT('OperIndiv'), TYPE

Но вывод:

<OperIndiv>
  <OpCli IDCli="1">
    <Name>Fernando</Name>
    <ApePat>Fernandez</ApePat>
    <ApeMat>Ferguson</ApeMat>
    <InfoCtble CtaCtable="1234">
      <SdoCtble>1000</SdoCtble>
    </InfoCtble>
    <InfoCtble CtaCtable="4321">
      <SdoCtble>3000</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="2">
    <Name>Gonzalo</Name>
    <ApePat>Gonzales</ApePat>
    <ApeMat>Gonzaga</ApeMat>
    <InfoCtble CtaCtable="2345">
      <SdoCtble>1344</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="3">
    <Name>Ramiro</Name>
    <ApePat>Ramirez</ApePat>
    <ApeMat>Ramsom</ApeMat>
    <InfoCtble CtaCtable="3456">
      <SdoCtble>2333</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="4">
    <Name>Rosa</Name>
    <ApePat>Rosales</ApePat>
    <ApeMat>Del Prado</ApeMat>
    <InfoCtble CtaCtable="4567">
      <SdoCtble>5555</SdoCtble>
    </InfoCtble>
    <InfoCtble CtaCtable="7654">
      <SdoCtble>1560</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="5">
    <Name>Sancho</Name>
    <ApePat>Sanchez</ApePat>
    <ApeMat>S.</ApeMat>
    <InfoCtble CtaCtable="5678">
      <SdoCtble>6788</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="6">
    <Name>Martín</Name>
    <ApePat>Martinez</ApePat>
    <ApeMat>Mortensen</ApeMat>
    <InfoCtble CtaCtable="6789">
      <SdoCtble>4400</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="7">
    <Name>Armando</Name>
    <ApePat>Armas</ApePat>
    <ApeMat>Gunn</ApeMat>
    <InfoCtble CtaCtable="7890">
      <SdoCtble>1200</SdoCtble>
    </InfoCtble>
  </OpCli>
</OperIndiv>

И что я действительно хочу, так это:

<OperIndiv>
  <OpCli IDCli="1">
    <Name>Fernando</Name>
    <ApePat>Fernandez</ApePat>
    <ApeMat>Ferguson</ApeMat>
    <InfoCtble CtaCtable="1234">
      <SdoCtble CtaCtable="1234">1000</SdoCtble>
      <SdoCtble CtaCtable="4321">3000</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="2">
    <Name>Gonzalo</Name>
    <ApePat>Gonzales</ApePat>
    <ApeMat>Gonzaga</ApeMat>
    <InfoCtble CtaCtable="2345">
      <SdoCtble>1344</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="3">
    <Name>Ramiro</Name>
    <ApePat>Ramirez</ApePat>
    <ApeMat>Ramsom</ApeMat>
    <InfoCtble CtaCtable="3456">
      <SdoCtble>2333</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="4">
    <Name>Rosa</Name>
    <ApePat>Rosales</ApePat>
    <ApeMat>Del Prado</ApeMat>
    <InfoCtble>
      <SdoCtble CtaCtable="4567">5555</SdoCtble>
      <SdoCtble CtaCtable="7654">1560</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="5">
    <Name>Sancho</Name>
    <ApePat>Sanchez</ApePat>
    <ApeMat>S.</ApeMat>
    <InfoCtble CtaCtable="5678">
      <SdoCtble>6788</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="6">
    <Name>Martín</Name>
    <ApePat>Martinez</ApePat>
    <ApeMat>Mortensen</ApeMat>
    <InfoCtble CtaCtable="6789">
      <SdoCtble>4400</SdoCtble>
    </InfoCtble>
  </OpCli>
  <OpCli IDCli="7">
    <Name>Armando</Name>
    <ApePat>Armas</ApePat>
    <ApeMat>Gunn</ApeMat>
    <InfoCtble CtaCtable="7890">
      <SdoCtble>1200</SdoCtble>
    </InfoCtble>
  </OpCli>
</OperIndiv>

Мне нужна другая группа узлов в <InfoCtble>. Я надеюсь, что вы можете мне помочь. Заранее спасибо.

1 Ответ

3 голосов
/ 20 сентября 2011
;with C as 
(
  select *,
         row_number() over(partition by idCli order by [Date]) as rn
  from CROMULTITEST02
)
select C1.idCli as '@IDCli',
       C1.Name,
       C1.Apepat,
       C1.Apemat,
       (select C1.CtaCtble as '@CtaCtable', 
               (select C2.CtaCtble as 'SdoCtble/@CtaCtable',
                       C2.SdoCtble as 'SdoCtble'
                from C as C2
                where C1.idCli = C2.idCli
                order by C2.rn
                for xml path(''), type)
        for xml path('InfoCtble'), type)        
from C as C1
where C1.rn = 1    
for xml path('OpCli'), root('OperIndiv')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...