2011-06-14 8 views
1

J'ai les données suivantes:SQL PIVOT TABLE

ID  Data 
1   tera 
1   add 
1   alkd 
2   adf 
2   add 
3   wer 
4   minus 
4   add 
4   ten 

Je suis en train d'utiliser un tableau croisé dynamique pour pousser les lignes dans une rangée avec plusieurs colonnes par ID. Ainsi, comme suit:

ID Custom1  Custom2 Custom3 Custom4.......... 
1  tera  add   alkd  
2  adf  add 
3  wer 
4  minus  add   ten 

Je la requête suivante jusqu'à présent:

INSERT INTO @SpeciInfo 
(ID, [Custom1], [Custom2], [Custom3], [Custom4], [Custom5],[Custom6],[Custom7],[Custom8],[Custom9],[Custom10],[Custom11],[Custom12],[Custom13],[Custom14],[Custom15],[Custom16]) 
    SELECT 
     ID, 
     [Custom1], 
     [Custom2], 
     [Custom3], 
     [Custom4], 
     [Custom5], 
     [Custom6], 
     [Custom7], 
     [Custom8], 
     [Custom9], 
     [Custom10], 
     [Custom11], 
     [Custom12], 
     [Custom13], 
     [Custom14], 
     [Custom15], 
     [Custom16] 
    FROM SpeciInfo) p 
    PIVOT 
    (
     (
      [Custom1], 
      [Custom2], 
      [Custom3], 
      [Custom4], 
      [Custom5], 
      [Custom6], 
      [Custom7], 
      [Custom8], 
      [Custom9], 
      [Custom10], 
      [Custom11], 
      [Custom12], 
      [Custom13], 
      [Custom14], 
      [Custom15], 
      [Custom16] 
     ) 
    ) AS pvt 
    ORDER BY ID; 

je besoin des 16 champs, mais je ne sais pas exactement ce que je fais dans la clause ou si je m même faire ça correctement?

Merci

Répondre

2

Si ce que vous cherchez est de construire dynamiquement les colonnes, que l'on appelle souvent un tableau croisé dynamique et ne peut pas être fait dans T-SQL sans avoir recours à SQL dynamique (la construction de la chaîne de la requête) qui est non recommandé. Au lieu de cela, vous devez générer cette requête dans votre application tierce ou de reporting.

Si vous voulez simplement une solution statique, une alternative à l'utilisation PIVOT de ce que vous cherchez pourrait ressembler à quelque chose comme si dans SQL Server 2005 ou version ultérieure:

With NumberedItems As 
    (
    Select Id, Data 
     , Row_Number() Over(Partition By Id Order By Data) As ColNum 
    From SpeciInfo 
    ) 
Select Id 
    , Min(Case When Num = 1 Then Data End) As Custom1 
    , Min(Case When Num = 2 Then Data End) As Custom2 
    , Min(Case When Num = 3 Then Data End) As Custom3 
    , Min(Case When Num = 4 Then Data End) As Custom4 
    ... 
From NumberedItems 
Group By Id 

Un problème sérieux dans vos données d'origine est qu'il y n'est pas un indicateur de séquence et donc il n'y a aucun moyen pour le système de savoir quel élément pour un ID donné doit apparaître dans la colonne Custom1 par opposition à la colonne Custom2. Dans ma requête ci-dessus, j'ai arbitrairement ordonné par nom.