1

Tableau 1requête de sélection par type sage

Code, desc, type id 

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

Je veux voir le tableau par type id sage

de sortie

Code type-1 type-2 type-3 type-4 

01 Rajan Vijayan suresh caresh 
01 Sajan null null Sujan 
01 null null null vikran 
02 desk card supan null 
02 null villa null null 
02 null megash null null 

attendu Comment faire une requête pour la condition ci-dessus

Besoin d'aide pour la recherche

+0

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 –

Répondre

2

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.

+0

Votre requête fonctionne parfaitement, j'ai besoin de savoir comment utiliser votre requête dans la vue ou la procédure de stockage, je suis nouveau à voir et stocker la procédure. Pouvez-vous me dire s'il vous plaît ..... – Gopal

+0

Parce qu'il y a un traitement intermédiaire, vous ne pouvez pas utiliser une vue. Assurez-vous simplement de le modifier pour remplir la première table temporaire avec les données de votre table réelle qui contient le code, desc, type colonnes. insérer #test sélectionner le code, desc, type_id de yourtable – TetonSig

+0

@TetonSig +1 Requête et explication parfaites. –

0
Select t1.code, t1.description, t2.description, t3.description from 
(Select code, description from table where type=1) t1, 
(Select code, description from table where type=2) t2, 
(Select code, description from table where type=3) t3, 
(Select code, description from table where type=4) t4 
Where t1.code=t2.code and t2.code=t3.code and t3.code=t4.code and t4.code=t1.code 
and t4.code=t2.code and t1.code=t3.code 

Essayez cette requête, il ne reviendra pas nulle, mais renverra des valeurs répétées

de contact si vous avez des doutes

+0

merci, je ne veux pas répéter les valeurs, il devrait afficher null valeurs au lieu de répéter les valeurs ... – Gopal

+0

Utilisation de l'instruction case dans la requête interne ex type de cas = 1 puis description else NULL end – Zlatan