2014-07-18 7 views
8

sto cercando di girare un tavolo intorno è molte colonne per arrivare a 3 colonne (pivot, nome di colonna, valore)SQL Server UNPIVOT più colonne

così per esempio:

name | age | gender 
------+-------+--------- 
John | 20 | M 
Jill | 21 | F 

diventerebbe :

name | column | value 
-----+--------+------- 
John | age | 20 
John | gender | M 
Jill | age | 21 
Jill | gender | F 

googled un bel po ', ma non ho trovato una situazione simile - soprattutto perché il perno sembra essere fatto nella direzione opposta, come quello che sto cercando di realizzare.

risposta

14

La conversione di colonne in righe è denominata UNPIVOT. Non hai specificato quale versione di SQL Server stai usando, ma ci sono diversi modi per ottenere il risultato.

È possibile utilizzare SELECT con UNION ALL:

SELECT name, 'age' as column, cast(age as varchar(10)) as value 
FROM yourtable 
UNION ALL 
SELECT name, 'gender' as column, gender as value 
FROM yourtable; 

Se si utilizza SQL Server 2005 +, quindi è possibile utilizzare la funzione UNPIVOT:

SELECT name, column, age 
FROM 
(
    SELECT 
    name, 
    age = cast(age as varchar(10)), 
    gender 
    FROM yourtable 
) d 
UNPIVOT 
(
    value 
    for column in (age, gender) 
) unpiv; 

Infine, anziché la funzione UNPIVOT voi potrebbe anche utilizzare CROSS APPLY con VALUES (2008+) o UNION ALL:

SELECT name, column, age 
FROM yourtable 
CROSS APPLY 
(
    VALUES 
    ('age', cast(age as varchar(10)), 
    ('gender', gender) 
) c (column, value); 

Ognuna di queste versioni ti darà il risultato che desideri. Noterai che ho dovuto trasmettere la colonna age a varchar. Questo perché il tipo di dati/lunghezza (in unpivot) delle colonne deve essere lo stesso poiché li trasformerai in una singola colonna nel risultato finale.

+0

Nei test su un server SQL 2008 potrebbe essere necessario specificare anche il valore max_length, quindi se Gender era char (1), era necessario eseguire il cast per far sì che lo switch unpivot non si verificasse. Non ho provato con l'applicazione esterna, però. –

+0

quindi quello che stai dicendo è, nella mia ricerca di come usare pivot, dal momento che ho trovato solo le applicazioni opposte, avrei dovuto guardare UNpivot ... geniale !! :) Grazie! – mathematician

+0

@JaazCole È solo UNPIVOT che richiede che il tipo di dati sia della stessa lunghezza - vedere questo su [DBA.SE] (http://dba.stackexchange.com/questions/54353/why-does-sql-server-require- il tipo di dati-lunghezza-to-be the same-when-using-unpivo) – Taryn