2016-10-11 1 views
0

J'ai récemment posé une question similaire mais, malheureusement, la nature de la demande a changé. J'ai regardé ce code un peu mais mon cerveau est ami et je ne peux pas vraiment penser à un moyen de le faire fonctionner au besoin.Besoin d'aide concat plusieurs champs en un basé sur d'autres champs

Travailler dans SQL 2005 et cela englobera des centaines de valeurs comme celle-ci.

Merci d'avance!

échantillon Tableau

+----+-------------+---------------------+---------------------+ 
| 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    | 
+----+-------------+---------------------+---------------------+ 

désiré Sortie

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

vous ne voulez pas une colonne de genre? – Beth

Répondre

0

Utilisation de l'astuce avec M AX et CAS QUAND mettre les classes en colonnes:

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; 

Alternativement, en utilisant PIVOT sur SQL Server 2008 ou au-delà:

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;