2016-10-11 4 views
0

Недавно я задал аналогичный вопрос, но, к сожалению, характер запроса изменился. Некоторое время смотрел на этот код, но мой мозг - друг, и я не могу придумать способ заставить его работать по мере необходимости.Нужна помощь concat несколько полей в одну из других полей

Работает в SQL 2005, и это будет охватывать сотни таких значений.

Заранее благодарен!

образца Таблица

+----+-------------+---------------------+---------------------+ 
| ID | CLASS | PARENT_ATTRIBUTE |  ATTRIBUTE  | 
+----+-------------+---------------------+---------------------+ 
| 1 | Genre  | A     | Hip Hop    | 
| 1 | Genre  | B     | Pop     | 
| 1 | Instruments | Keyboards   | Synth    | 
| 1 | Instruments | Keyboards   | Grand Piano   | 
| 1 | Instruments | Drums    | Kit     | 
| 1 | Moods  | Positive/Optimistic | Uplifting/Inspiring | 
| 1 | Moods  | Positive/Optimistic | Happy/Feel Good  | 
| 1 | Moods  | Musical Feel  | Pulsing    | 
+----+-------------+---------------------+---------------------+ 

Желаемая Выход

+----+----------------------------------------------------------------------------------------------------------+---------------------------------------------------------+ 
| ID | MOODS                         | INSTRUMENTS            | 
| 1 |Positive/Optimistic - Uplifting/Inspiring, Positive/Optimistic - Happy/Feel Good, Musical Feel - Pulsing | Keyboards - Synth, Keyboards - Grand Piano, Drums - Kit | 
+----+----------------------------------------------------------------------------------------------------------+---------------------------------------------------------+ 
+0

вы не хотите столбец жанр? – Beth

ответ

0

Использование трюка с M AX и случай, когда поместить классы в столбцы:

SELECT ID, 
MAX(CASE WHEN class = 'Instruments' THEN attribs END) as INSTRUMENTS, 
MAX(CASE WHEN class = 'Moods' THEN attribs END) as MOODS, 
MAX(CASE WHEN class = 'Genre' THEN attribs END) as GENRES 
FROM (
    SELECT 
    id, class, 
    STUFF ((
     SELECT ', ' + parent_attribute + ' - ' + attribute 
     FROM YourTable i 
     WHERE i.ID = o.ID AND i.CLASS = o.CLASS 
     FOR XML PATH('') 
    ), 1, 2, '') AS attribs 
    FROM (SELECT DISTINCT id, class FROM YourTable) o 
) q 
GROUP BY id 
ORDER BY id; 

Кроме того, с помощью PIVOT на SQL Server 2008 или за его пределами:

select ID, 
[Instruments] as INSTRUMENTS, 
[Moods] as MOODS, 
[Genre] as GENRES 
from (
    SELECT id, class, 
    STUFF ((
     SELECT ', ' + parent_attribute + ' - ' + attribute 
     FROM YourTable i 
     WHERE i.ID = o.ID AND i.CLASS = o.CLASS 
     FOR XML PATH('') 
    ), 1, 2, '') AS attribs 
    FROM (select distinct id, class from YourTable) o 
) q 
PIVOT (MAX(attribs) FOR class IN ([Instruments], [Moods], [Genre]) 
) pvt 
order by id;