2017-01-11 1 views
3

j'ai 4 colonnes dans ma table comme:Transposer seulement quelques colonnes dans SQL Server

key  cusi    isi    name 
1  46644UAQ1   US46642EAV83  A 
1  46644UAR9   XS0062104145  A 
1  254206AC9       A        
2  05617YAJ8   US86359AXP38  B  
2  885220BP7       B 
2  null        B 
3  885220BP5   885220BP7345  c 

le contenu de la clé et la colonne de nom se reproduit en raison de la colonne de Cusi et isi .Je voudrais transposer seulement quelques-uns colonnes dans ce cas cusi et isi colonne de sorte que je reçois 1 enregistrement de id = 1 et un autre pour id = 2. Dans mon cas d'utilisation, il peut y avoir à la max 3 citei ditus ou 3 isi colonne.

Le tableau de transposition devrait comme

key name cusi1  cusi2  cusi3  isi1   isi2   isi3 
    1 A 46644UAQ1 46644UAR9 254206AC9 US46642EAV83 XS0062104145 NULL 
    2 A 46644UAR9 05617YAJ8 885220BP7 US86359AXP38 NULL   NULL 
    3 c 885220BP5  null  null  885220BP7345 NULL   NULL 

Dans certains cas, il pourrait y avoir seulement 1 rang comme dans t-il exemple ci-dessus, il est pour la clé = 3

Je sais que sql a PIVOT et les requêtes UNPIVOT mais je ne suis pas sûr de savoir comment l'utiliser pour la transposition en sélectionnant les colonnes d'une table Toute aide serait d'une grande aide. Merci

Répondre

0

Si vous savez que chaque key - groupe name aura un nombre fixe d'enregistrements (trois, en fonction des données d'exemple que vous nous avez donné), puis un pivot non ordinaire devrait fonctionner. Dans la requête ci-dessous, j'utilise le numéro de ligne pour distinguer chacune des trois colonnes que vous voulez pour cusi et isi dans votre jeu de résultats.

SELECT t.key, 
     t.name, 
     MAX(CASE WHEN t.rn = 1 THEN cusi END) AS cusi1, 
     MAX(CASE WHEN t.rn = 2 THEN cusi END) AS cusi2, 
     MAX(CASE WHEN t.rn = 3 THEN cusi END) AS cusi3, 
     MAX(CASE WHEN t.rn = 1 THEN isi END) AS isi1, 
     MAX(CASE WHEN t.rn = 2 THEN isi END) AS isi2, 
     MAX(CASE WHEN t.rn = 3 THEN isi END) AS isi3 
FROM 
(
    SELECT key, 
      cusi, 
      isi, 
      name, 
      ROW_NUMBER() OVER(PARTITION BY key ORDER BY cusi) AS rn 
    FROM yourTable 
) t 
GROUP BY t.key, 
     t.name 

Notez que SQL Server a également une fonction PIVOT, qui est une alternative à ce que j'ai donné.

+0

dans certains cas je n'aurai pas 3 lignes, je pourrais avoir seulement 1 rangée comment devrais-je traiter avec cela dans cette requête. J'ai modifié mon cas d'utilisation pour montrer key = 3 à cet effet – baiduXiu

+0

Cela ne devrait pas être un problème, dans ce cas vous auriez juste des entrées/NULL entrées pour ces lignes manquantes. –

+0

grand cela fonctionne. Merci pour l'aide rapide – baiduXiu