2016-05-27 1 views
0

J'ai essayé de faire des tableaux croisés dynamiques, mais uniquement pour un nombre fixe de lignes.Sybase ASE Transpose un nombre indéfini de lignes aux colonnes

J'ai les documents suivants:

ID CODE 
=== ==== 
1 AAA 
1 BBB 
1 CCC 
2 DDD 
3 EEE 
3 FFF 
4 GGG 
4 HHH 
4 III 
4 JJJ 

Et mon résultat attendu est:

ID CODE1 CODE2 CODE3 CODE4 
=== ===== ===== ===== ===== 
1 AAA BBB CCC 
2 DDD 
3 EEE FFF 
4 GGG HHH III JJJ 

Prenez note que le nombre de lignes retournées par identifiant est pas fixé. Je veux éviter le curseur autant que possible.

Répondre

0

Pour le faire sans boucle, vous devez ajouter un numéro de ligne artificiel, par exemple à travers une colonne d'identité. Si vous ne souhaitez pas modifier votre schéma, copiez tout d'abord la table dans une table temporaire. (Je n'ai pas vérifié les erreurs de syntaxe mais vous aurez l'idée)

alter table yourtab add seq int identity not null 

select id, min_seq=min(seq) into #t from yourtab group by id 

select id=max(id), code1=max(code1), code2=max(code2), 
code3=max(code3), (etc) from (select  id = yourtab.id, 
code1=case (yourtab.id-#t.min_seq) when 0 then code else null end, 
code2=case (yourtab.id-#t.min_seq) when 1 then code else null end, 
code3=case (yourtab.id-#t.min_seq) when 2 then code else null end, 
[...etc...] 
from yourtab, #t where yourtab.id = #t.id order by 
yourtab.id) as newtab