2009-08-09 19 views
5

Ho una tabella di dati con nomi di colonna:SQL nomi delle colonne Selezione come valori

period, Truck, Car, Boat 

in cui le colonne contengono valori numerici, e la colonna periodo è una colonna di identità con da 1 a 48, quindi ci sono 48 filari.

Vorrei massaggiare questa tabella in un formato in cui ho una colonna Nome e una colonna di valori, nonché la colonna periodo es.

period, NameOfVehicle, Value 

Voglio creare una vista del tavolo originale per fare questo? Come posso selezionare i nomi delle colonne e posizionarli e il valore corretto da quella colonna nelle colonne NameOfVehicle e Value?

+0

si sta andando ad avere bisogno di essere più preciso circa i dati che avete - come esattamente dovrebbero i contenuti di NameOfVehicle essere determinati, ecc – Amber

+0

I contenuti di NameAndVehicle sono Truck, Car e Boat. – theringostarrs

risposta

10

Se è stato fissato colonne si può sempre fare questo:

SELECT period, 'Truck' AS NameOfVehicle, Truck AS Value FROM vehicle 
UNION ALL 
SELECT period, 'Car', Car FROM vehicle 
UNION ALL 
SELECT period, 'Boat', Boat FROM vehicle 

Se le colonne sono dinamici o sconosciuti allora è un po 'più difficile e si baserà su funzionalità specifiche del fornitore per interrogare lo schema e uno SQL dinamico dichiarazione.

2

Mentre interrogazione di Cletus è corretto, vale la pena sottolineare che è possibile utilizzare la parola chiave UNPIVOT in SQL Server 2005 e versioni successive a fare quasi la stessa cosa:

select 
    period, nameOfVehicle, value 
    from T unpivot (
    value for nameOfVehicle in ([Car],[Truck],[Boat]) 
) as U; 

La differenza tra la soluzione UNPIVOT e Cletus di è che UNPIVOT non includerà righe per le quali [valore] È NULL. Se avete bisogno di NULL, dovrete essere un po 'subdolo e utilizzare un valore che non può mai verificarsi nella tabella (qui io uso una stringa vuota):

with X(period,Car,Truck,Boat) as (
    select period,coalesce(Car,''),coalesce(Truck,''),coalesce(Boat,'') 
    from T 
) 
    select 
    period, nameOfVehicle, case when value = '' then null else value end as value 
    from X unpivot (
    value for nameOfVehicle in ([Car],[Truck],[Boat]) 
) as U; 

A seconda delle colonne che terremo dopo unpivoting, questo può essere un'altra opzione (questa soluzione manterrà i valori NULL):

select 
    period, 
    nameOfVehicle, 
    max(case nameOfVehicle 
     when 'Truck' then Truck 
     when 'Car' then Car 
     when 'Boat' then Boat end) as value 
    from T cross join (
    values ('Truck'),('Car'),('Boat') 
) as Columns(nameOfVehicle) 
group by period, nameOfVehicle; 
Problemi correlati