2017-02-02 2 views
1
TableA -- list of objects 
-------- 
Rec1 
Rec2 
Rec3 

TableB -- list of TONS of details A->B = 1->MMM 
-------- 
Rec1, data..., String1 
Rec1, data..., String1 
Rec1, data..., String1 
Rec1, data..., String2 
Rec2, data..., String1 
Rec2, data..., String1 
Rec3, data..., String1 
Rec3, data..., String1 
Rec3, data..., String2 
Rec3, data..., String2 
Rec3, data..., String3 

Запрос уменьшает таблицу B в гораздо меньшем количестве записей, сокращая некоторые детали, оставляя 1-> Mчистый код против кучки временных таблиц

QueryResult 
------------ 
Rec1, String1 
Rec1, String2 
Rec2, String1 
Rec3, String1 
Rec3, String2 
Rec3, String3 

Попытка построить

Final 
--------- 
Rec1, String1 + String2 
Rec2, String1 
Rec3, String1 + String2 + String3 

Я попытался добавить столбцы для каждой отдельной строки, соответствующим образом уложив строки, а затем объединив отдельные строки в итоговый столбец. В то время как это работает, оно выглядит уродливым и напоминает только наличие молотка в моей панели инструментов.

Есть ли более элегантное решение, использующее инструменты, отличные от моего большого молотка ole?

Комментарии и идеи были бы очень признательны. Спасибо!

+0

Ваш вопрос непонятен. Пожалуйста, уточните, что вы пытаетесь выполнить и что сделали. – tonythewest

+0

Спасибо за прыжки в тони-запад. iamdave прибил его в одном. –

ответ

2

Вы можете сделать это с for xml, вступив оригинал TableA к вашему QueryResult:

declare @TableA table(TableA nvarchar(10)); 
insert into @TableA values('Rec1'),('Rec2'),('Rec3'); 

declare @QueryResult table(TableA nvarchar(10),TableB nvarchar(10)); 
insert into @QueryResult values('Rec1','String1'),('Rec1','String2'),('Rec2','String1'),('Rec3','String1'),('Rec3','String2'),('Rec3','String3'); 


select TableA 
     ,stuff((select ', ' + TableB -- The ', ' is the delimiter. The first instance of this is removed by the STUFF function. 
       from @QueryResult t2 
       where t1.TableA = t2.TableA 
       order by t2.TableB 
       for xml path('') 
       ) 
       ,1,2,''     -- This is where you specify how much from the start to remove. 
      ) as TableB 
from @TableA t1; 

Выход:

+--------+---------------------------+ 
| TableA |   TableB   | 
+--------+---------------------------+ 
| Rec1 | String1, String2   | 
| Rec2 | String1     | 
| Rec3 | String1, String2, String3 | 
+--------+---------------------------+ 

stuff функция начинается с п-го символа, как указано в первом значении параметра (в этом случае 1) и заменяет его и все до символа во второй позиции параметра (в этом случае символ 2) с y наше третье значение параметра (в этом случае пустая строка '').

Это означает, что нормальный из положить в for xml выше высказывании будет , String1, String2 для Rec1, но после того, как stuff применяется первые два символа заменяются пустой строкой, так String, результаты String2`.

+0

Вы избили меня за секунды :-) +1 – Shnugo

+0

Вытащите палец из шнауков – iamdave

+0

@iamdave Спасибо. Искал веками для предыдущих вопросов, разместил это и затем нашел длительные дискуссии по этой теме. Цените свое короткое и сладкое решение. –

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