2016-10-24 7 views
2

동일한 기본 테이블 (dbo.Submission)에서 가져 오는 2 세트의 XML 데이터를 함께 결합했습니다.SQL XML - 2 세트의 개별 데이터 - ORDER BY 및 RowNumber

[AddedDt]라는 dbo.Submission에있는 DATETIME 필드가 있는데, 다른 기준 2 세트를 기반으로 데이터를 선택하고 있지만 반환 된 데이터의 ORDER BY [AddedDt]를이 XML 제출 형식으로 지정하고 싶습니다. 시간 순서대로 가야한다.

다음은 내 SELECT 문입니다. 각 쿼리 내에서 ORDER BY를 사용했지만 [AddedDt] Order의 관련 쿼리 만 주문합니다. 나는

ROW_NUMBER() OVER (ORDER BY (SELECT sub.AddedDt 
           )) AS "PolicyRecordNumber" , 

그러나 이것은 '정책'각 정책의 요소 아래에 표시하고, 순차적으로, 어떻게 할 수 실행이 원래의 데이터 사용했다, 행의 번호가 추가 노드를 추가 할 필요가 나는 이것을 성취합니까?

SELECT (SELECT sub.Polno AS "Cancellation/PolicyNumber" , 
       sub.Term_date AS "Cancellation/CancellationDate" , 
       sub.PremXIPT AS "Cancellation/ReturnPremium/NetAmount" , 
       sub.PremIPT AS "Cancellation/ReturnPremium/Ipt" , 
       sub.FeeXIPT AS "Cancellation/Fee/NetAmount" , 
       sub.FeeIPT AS "Cancellation/Fee/Ipt" 
     FROM  dbo.Submissions sub 
     WHERE  sub.[Transaction] = 'Cancellation' 
     ORDER BY sub.AddedDt 
    FOR 
     XML PATH('Policy') , 
      TYPE 
    ) , 
    (SELECT sub.Polno AS "PCNewBusiness/PolicyNumber" , 
       sub.[Inception Date] AS "PCNewBusiness/StartDate" , 
       sub.[Renewal Date] AS "PCNewBusiness/StartDate" , 
       sub.PremXIPT AS "PCNewBusiness/Premium/NetAmount" , 
       sub.PremIPT AS "PCNewBusiness/Premium/IPT" , 
       sub.FeeXIPT AS "PCNewBusiness/Fee/NetAmount" , 
       sub.FeeIPT AS "PCNewBusiness/Fee/IPT" , 
       ph.Title AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Name/Title" , 
       ph.Firstname AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Name/FirstNames" , 
       ph.Surname AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Name/LastName" , 
       ph.DateOfBirth AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/DateOfBirth" , 
       ph.MaritalStatus AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/MaritalStatus" , 
       ph.Sex AS "PCNewBusiness/Policyholder/PolicyholderType/PrivateIndividual/Sex" , 
       ph.Contact AS "PCNewBusiness/Policyholder/Contact" , 
       ph.Addr1 AS "PCNewBusiness/Policyholder/Address/Address1" , 
       ph.Addr2 AS "PCNewBusiness/Policyholder/Address/Address2" , 
       ph.Addr3 AS "PCNewBusiness/Policyholder/Address/Address3" , 
       ph.Addr4 AS "PCNewBusiness/Policyholder/Address/Address4" , 
       ph.Pcode AS "PCNewBusiness/Policyholder/Address/Postcode" , 
       ISNULL(ph.Tel, ph.Tel2) AS "PCNewBusiness/Policyholder/Phone" , 
       ph.Email AS "PCNewBusiness/Policyholder/Email" , 
       cov.Cover AS "PCNewBusiness/Cover/CoverType" , 
       cov.Excess AS "PCNewBusiness/Cover/PolicyExcess" , 
       cov.NCBYears AS "PCNewBusiness/Cover/NoClaimsBonusYears" , 
       cov.NCBOtherVeh AS "PCNewBusiness/Cover/NCBOtherVehicle" , 
       cov.ClassOfUse AS "PCNewBusiness/Cover/Use" , 
       (SELECT dri1.RelationshipToPH 'RelationshipToPolicyholder' , 
          (SELECT dri2.Drivertitle 'Title' , 
             dri2.FirstName 'FirstNames' , 
             dri2.Surname 'LastName' 
           FROM  dbo.Drivers dri2 
           WHERE  dri1.ID = dri2.ID 
             AND dri1.Driver = dri2.Driver 
          FOR 
           XML PATH('Name') , 
            TYPE 
          ) , 
          dri1.DOB 'DateOfBirth' , 
          dri1.Licence 'LicenceType' , 
          dri1.LicenceHeld 'PeriodLicenceHeld' , 
          (SELECT ph1.Addr1 'Address1' , 
             ph1.Addr2 'Address2' , 
             ph1.Addr3 'Address3' , 
             ph1.Addr4 'Address4' , 
             ph1.Pcode 'AddressPostcode' 
           FROM  dbo.PolicyHolder ph1 
           WHERE  ph1.ID = ph.ID 
          FOR 
           XML PATH('HomeAddress') , 
            TYPE 
          ) , 
          dri1.PeriodResident 'PeriodResident' , 
          dri1.VehFreq 'VehicleUseFrequency' , 
          dri1.OtherVehs 'HasUseOfOtherVehicle' , 
          ISNULL(dri1.Occupation, [dri1].[2ndOccupation]) 'MainOccupation' , 
          dri1.[2ndOccupation] 'SecondaryOccupation' , 
          dri1.RefIns 'MotorInsuranceRefusalDetails' , 
          dri1.Accconv 'HasCriminalConvictions' , 
          (SELECT 'false' 'Removed' , 
             TWClaimType 'ClaimType' , 
             IncidentDate , 
             Amount 
           FROM  dbo.Claims cla1 
           WHERE  cla1.ID = sub.ID 
             AND cla1.Driver = dri1.Driver 
          FOR 
           XML PATH('DriverClaim') , 
            TYPE 
          ) AS "Claims" , 
          (SELECT 'false' 'Removed' , 
             con1.ConvCode 'ConvictionCode' , 
             con1.ConvDate 'ConvictionDate' , 
             con1.Amount 'Fine' 
           FROM  dbo.Convictions con1 
           WHERE  con1.ID = sub.ID 
             AND con1.Driver = dri1.Driver 
          FOR 
           XML PATH('DriverConviction') , 
            TYPE 
          ) AS "Convictions" , 
          (SELECT 'false' 'Removed' , 
             med1.Description , 
             med1.AgeDiagnosed , 
             med1.Medication , 
             med1.[DVLA Notified] 'DvlaNotified' , 
             med1.CondNote 'ConditionDeteriorating' , 
             med1.LicRest 'LicenceRestricted' 
           FROM  dbo.Medical med1 
           WHERE  med1.ID = sub.ID 
             AND med1.Driver = dri1.Driver 
          FOR 
           XML PATH('DriverMedicalCondition') , 
            TYPE 
          ) AS "MedicalConditions" 
        FROM  dbo.Drivers dri1 
        WHERE  dri1.ID = sub.ID 
       FOR 
        XML PATH('Drivers') , 
         TYPE 
       ) AS "PCNewBusiness/Driver" , 
       veh.Make AS "PCNewBusiness/Vehicles/Vehicle/Make" , 
       veh.Model AS "PCNewBusiness/Vehicles/Vehicle/Model" , 
       veh.Reg AS "PCNewBusiness/Vehicles/Vehicle/RegistrationNumber" , 
       veh.Body AS "PCNewBusiness/Vehicles/Vehicle/BodyType" , 
       veh.Parking AS "PCNewBusiness/Vehicles/Vehicle/LocationWhenNotInUse" , 
       (SELECT SUM(Mileage) 'AnnualMileage' 
        FROM  dbo.Drivers dri2 
        WHERE  sub.ID = dri2.ID 
       ) AS "PCNewBusiness/Vehicles/Vehicle/AnnualMileage" , 
       veh.YearMade AS "PCNewBusiness/Vehicles/Vehicle/YearOfManufacture" , 
       veh.Engine_size AS "PCNewBusiness/Vehicles/Vehicle/EngineSizeCc" , 
       veh.Purchasedate AS "PCNewBusiness/Vehicles/Vehicle/PurchaseDate" , 
       veh.Value AS "PCNewBusiness/Vehicles/Vehicle/PurchasePrice" , 
       veh.Value1 AS "PCNewBusiness/Vehicles/Vehicle/EstimatedValue" , 
       veh.Seats AS "PCNewBusiness/Vehicles/Vehicle/NumberOfSeats" , 
       veh.RightHandDrive AS "PCNewBusiness/Vehicles/Vehicle/RightHandDrive" , 
       veh.Fuel AS "PCNewBusiness/Vehicles/Vehicle/FuelType" 
     FROM  dbo.Submissions sub 
       LEFT OUTER JOIN dbo.PolicyHolder ph ON ph.ID = sub.ID 
       LEFT OUTER JOIN dbo.Cover cov ON cov.ID = sub.ID 
       LEFT OUTER JOIN dbo.Vehicle veh ON veh.ID = sub.ID 
     WHERE  sub.[Transaction] = 'New Business'   
     ORDER BY sub.AddedDt   
    FOR 
     XML PATH('Policy') , 
      TYPE 
    ) 
FOR  XML PATH('Policies'); 
+0

안녕을 가지고있다! 이 질문이 해결 되었습니까? 추가 도움이 필요합니까? 나에게 한 가지 힌트를 허용하십시오.이 질문이 해결되면 (가장) 답변의 투표 카운터 아래에서 수락 확인을 확인하는 것이 매우 친절한 것입니다. 이것은 1)이 이슈를 해결 된 것으로 표시 할 것입니다. 2) 추종자가 가장 좋은 해결책을 쉽게 찾을 수 있도록합니다. 3) 응답자에게 포인트를 지불하고 4) 포인트를줍니다. 15 포인트의 국경을 넘었으므로 추가로 투표에 기부합니다. 이것은 당신을 감사하는 SO 방법입니다. 해피 코딩! – Shnugo

답변

0

당신은 처음에는 CTE에서 실행중인 레코드 번호를 추가 할 수 있습니다. 불필요한 코드를 많이 게시했습니다. 다음에 여기

이 scenarion의 모형입니다 ... 오히려 ... 필요로하는 라인에 코드를 줄일 수 MCVE를 완료하기 위해 테이블 ​​선언 및 샘플 데이터를 추가 해보세요

DECLARE @YourTbl TABLE(ID INT IDENTITY, AddedDt DATETIME,GroupingValue VARCHAR(100),SomeValue VARCHAR(100)); 

INSERT INTO @YourTbl VALUES 
({ts'2016-01-01 00:00:00'},'A','Value A1') 
,({ts'2016-01-02 00:00:00'},'B','Value B1') 
,({ts'2016-01-03 00:00:00'},'A','Value A2') 
,({ts'2016-01-04 00:00:00'},'A','Value A3') 
,({ts'2016-01-05 00:00:00'},'B','Value B3') 
,({ts'2016-01-06 00:00:00'},'B','Value B3') 
,({ts'2016-01-07 00:00:00'},'A','Value A4'); 

--This 숫자

WITH NumberedCTE AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY AddedDt) AS PolicyRecordNumber 
      ,* 
    FROM @YourTbl 
) 

- 그리고이 그룹화되는 XML 생성

SELECT t1.GroupingValue AS [@ID] 
     ,(
     SELECT AddedDt AS [@dt] 
       ,SomeValue AS [@val] 
       ,PolicyRecordNumber AS [@rn] 
     FROM NumberedCTE AS t2 
     WHERE t1.GroupingValue=t2.GroupingValue 
     ORDER BY PolicyRecordNumber 
     FOR XML PATH('Detail'),TYPE 
     ) 
FROM NumberedCTE AS t1 
GROUP BY t1.GroupingValue 
FOR XML PATH('Group'),ROOT('root') 
0,123,516을 가산 CTE이며

--The 결과는 내부적으로 정렬되고 원래의 레코드 번호

<root> 
    <Group ID="A"> 
    <Detail dt="2016-01-01T00:00:00" val="Value A1" rn="1" /> 
    <Detail dt="2016-01-03T00:00:00" val="Value A2" rn="3" /> 
    <Detail dt="2016-01-04T00:00:00" val="Value A3" rn="4" /> 
    <Detail dt="2016-01-07T00:00:00" val="Value A4" rn="7" /> 
    </Group> 
    <Group ID="B"> 
    <Detail dt="2016-01-02T00:00:00" val="Value B1" rn="2" /> 
    <Detail dt="2016-01-05T00:00:00" val="Value B3" rn="5" /> 
    <Detail dt="2016-01-06T00:00:00" val="Value B3" rn="6" /> 
    </Group> 
</root>