Alors d'abord la mise en scène juste votre place de données. Notez que j'ajoute un identifiant de ligne d'identité pour plus tard.
IF OBJECT_ID('tempdb..#test') IS NOT NULL
drop table #test
IF OBJECT_ID('tempdb..#Numbered') IS NOT NULL
drop table #Numbered
CREATE TABLE #test (Code CHAR(2), [DESC] varchar(10), [type id] INT, RowNumber INT IDENTITY(1,1))
INSERT #test
VALUES ('01', 'Rajan', 1),
('01' ,'Sajan', 1),
('01' ,'Vijayan', 2),
('01' ,'Suresh', 3),
('01' ,'Caresh', 4),
('01' ,'Sujesh', 4),
('01' ,'vikran', 4),
('02' ,'desk', 1),
('02' ,'card' ,2),
('02' ,'villa', 2),
('02', 'megash', 2),
('02', 'supan', 3)
Ensuite, nous créons une zone de maintien qui utilise cet identifiant de ligne pour calculer quelle ligne du code chacun des noms devrait continuer.
CREATE TABLE #Numbered
(
RowNum int, Code CHAR(2), [type] VARCHAR(10), [DESC] VARCHAR(10)
)
INSERT #Numbered
SELECT (select count(*) from #test where code=t1.Code AND [type id]=t1.[type id] AND RowNumber<=t1.RowNumber),
code,
[type id],
[DESC]
FROM #test t1
Enfin, nous créons un tableau croisé dynamique sur les données, (fait de manière standard SQL 2000 de « faire semblant » que l'opérateur). Nous plaçons ensuite cette table "PIVOT" dans une sélection dérivée qui retourne uniquement les colonnes que nous voulons mais qui nous permet de trier les colonnes code et rownum pour générer la sortie que vous avez demandée.
SELECT Code,[type-1],[type-2],[type-3],[type-4]
FROM (Select P.Code,RowNum
, Min(Case When type = '1' Then [DESC] End) As [type-1]
, Min(Case When type = '2' Then [DESC] End) As [type-2]
, Min(Case When type = '3' Then [DESC] End) As [type-3]
, Min(Case When type = '4' Then [DESC] End) As [type-4]
From #Numbered As P
Group By P.Code,RowNum) R
ORDER BY Code,RowNum
S'il vous plaît laissez-moi savoir si vous voulez plus d'explications sur tout cela.
Normalement, je dirais que PIVOT ici, mais je ne suis pas sûr que vous pouvez le faire dans ce cas, car vous avez affaire à varchars au lieu de chiffres –