2013-01-24 2 views
3

Как создать наборы подобных данных и связать обратно связанный ключ.Как агрегировать подобные наборы в SQL

В примере ниже показано, как необработанные данные и желаемый результат.

DECLARE @Data TABLE (PID INT, CID INT) 

INSERT INTO @Data 
VALUES (1, 1), (1, 2), (1, 3), (3, 1), (3, 2), (3, 3), (2, 1), (2, 2), (4, 3), (4, 4), 
     (5, 4), (5, 5), (8, 4), (8, 5), (6, 6), (7, 4), (7, 5), (7, 6) 

В приведенных выше данных, CID наборы 1, 2, 3 отличаются от 1, 2. Они являются уникальными множества.

Я хочу, чтобы связать

PID 1 и 3 к множеству 1, 2, 3.

PID 2 установить 1, 2

PID 4 для установки 3, 4

ПИД-5 и 8, чтобы установить 4, 5

т.д.

общая цель состоит, чтобы вернуться XML, который похож на:

<Items> 
    <Item> 
    <Hierarchies> 
     <Hierarchy> 
      <CID>1</CID> 
      <CID>2</CID> 
      <CID>3</CID> 
     </Hierarchy> 
    </Hierarchies> 
    <PIDs> 
     <PID>1</PID> 
     <PID>3</PID> 
    </PIDs> 
    </Item> 
    <Item> 
    <Hierarchies> 
     <Hierarchy> 
      <CID>1</CID> 
      <CID>2</CID> 
     </Hierarchy> 
    </Hierarchies> 
    <PIDs> 
     <PID>2</PID> 
    </PIDs> 
    </Item> 
    <Item> 
    <Hierarchies> 
     <Hierarchy> 
      <CID>3</CID> 
      <CID>4</CID> 
     </Hierarchy> 
    </Hierarchies> 
    <PIDs> 
     <PID>4</PID> 
    </PIDs> 
    </Item> 
    <Item> 
     ... Etc ... 
    </Item> 
<Items> 
+2

На данный момент ... кофеин. Пробовал использовать PIVOT (о котором я не очень разбираюсь) и создания сумасшедшей логики на основе курсора. Прямо сейчас, я просто потерялся. Я в порядке с созданием XML, агрегация - это то место, где я застреваю. –

+4

Вы пытались поставить клавиатуру, вытащить карандаш и бумагу и попытаться описать пошаговый алгоритм, который выводит вас из ввода в вывод? – mellamokb

+3

Можете ли вы объяснить на английском языке, что вы пытаетесь выполнить? Если вы не можете, вы никогда не доберетесь туда. –

ответ

4

что-то вроде этого? или я неправильно понял?

DECLARE @Data TABLE (PID INT, CID INT) 

    INSERT INTO @Data 
    VALUES (1, 1), (1, 2), (1, 3), (3, 1), (3, 2), (3, 3), (2, 1), (2, 2), (4, 3), (4, 4), 
      (5, 4), (5, 5), (8, 4), (8, 5), (6, 6), (7, 4), (7, 5), (7, 6) 

    with cid_xml as ( select P.PID 
           ,OA.CID 
         from @Data P 
         outer apply (select CAST((select C.CID 
                from @Data C 
                where C.PID = P.PID 

                for xml path('')) as varchar(max)) as CID 
            ) OA 
        ) 
    select cast((select cast(C2.CID as xml) as 'hierarchies/hierarchy' 
         ,cast(OA2.PID as xml) as 'PIDs' 
       from cid_xml C2 
       outer apply (select CAST((select C3.PID 
              from cid_xml C3 
              where C3.CID = C2.CID 
              group by C3.PID 
              for xml path('')) as varchar(max)) as PID 
          )OA2 
       group by C2.CID,OA2.PID 
       order by LEN(C2.CID) desc 
       for xml path('item')) as xml) 
    for xml path('Items') 

Я просто сделал заказ, чтобы увидеть первые узлы пункта/иерархий/иерархии, как вы делали в вашей выборке результата прицельной

результирующего, что я получил

<Items> 
    <item> 
     <hierarchies> 
     <hierarchy> 
      <CID>1</CID> 
      <CID>2</CID> 
      <CID>3</CID> 
     </hierarchy> 
     </hierarchies> 
     <PIDs> 
     <PID>1</PID> 
     <PID>3</PID> 
     </PIDs> 
    </item> 
    <item> 
     <hierarchies> 
     <hierarchy> 
      <CID>4</CID> 
      <CID>5</CID> 
      <CID>6</CID> 
     </hierarchy> 
     </hierarchies> 
     <PIDs> 
     <PID>7</PID> 
     </PIDs> 
    </item> 
    <item> 
     <hierarchies> 
     <hierarchy> 
      <CID>3</CID> 
      <CID>4</CID> 
     </hierarchy> 
     </hierarchies> 
     <PIDs> 
     <PID>4</PID> 
     </PIDs> 
    </item> 
    <item> 
     <hierarchies> 
     <hierarchy> 
      <CID>4</CID> 
      <CID>5</CID> 
     </hierarchy> 
     </hierarchies> 
     <PIDs> 
     <PID>5</PID> 
     <PID>8</PID> 
     </PIDs> 
    </item> 
    <item> 
     <hierarchies> 
     <hierarchy> 
      <CID>1</CID> 
      <CID>2</CID> 
     </hierarchy> 
     </hierarchies> 
     <PIDs> 
     <PID>2</PID> 
     </PIDs> 
    </item> 
    <item> 
     <hierarchies> 
     <hierarchy> 
      <CID>6</CID> 
     </hierarchy> 
     </hierarchies> 
     <PIDs> 
     <PID>6</PID> 
     </PIDs> 
    </item> 
    </Items> 

все нормально?

+0

Похоже, что это трюк! Спасибо, что просветили меня и вашу помощь! Идти, чтобы применить это к моему решению, чтобы удвоить, убедитесь, что он подходит. –

+0

Работает очень хорошо. Еще раз спасибо, Фредерик. –

+0

вы приветствуете, alex! – Frederic

Смежные вопросы