2009-08-09 16 views
5

mam tabeli danych o nazwach: kolumnaSQL nazwy Wybór kolumny jako wartości

period, Truck, Car, Boat 

którym kolumny zawierają wartości numerycznej, kolumna okres jest kolumna tożsamości mający od 1 do 48, tak że jest 48 wydziwianie.

Chciałbym masować tę tabelę do formatu, w którym mam kolumnę Nazwa i kolumnę wartości, a także kolumnę okresu, np.

period, NameOfVehicle, Value 

Chciałbym utworzyć widok na ten sam stół, aby to zrobić? Jak mogę wybrać nazwy kolumn i umieścić je oraz poprawną wartość z tej kolumny w kolumnach NameOfVehicle i Value?

+0

masz zamiar muszą być bardziej szczegółowe na temat danych, które mają - jak dokładnie powinno zawartość NameOfVehicle być ustalona, ​​etc – Amber

+0

Zawartość NameAndVehicle to Ciężarówka, Samochód i Łódź. – theringostarrs

Odpowiedz

10

Jeśli mają stałe kolumny zawsze można to zrobić:

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 

Jeśli kolumny są dynamiczne lub nieznane wtedy jest nieco trudniejsze i będzie opierać się na funkcjonalności specyficznych dla dostawcy kwerendy schematu i dynamiczny SQL komunikat.

2

Podczas kwerendy Cletus jest poprawna, to warto zwrócić uwagę, że można użyć UNPIVOT słów kluczowych w SQL Server 2005 i później zrobić prawie to samo:

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

Różnica między UNPIVOT and Cletus za rozwiązaniem jest UNPIVOT nie będzie zawierać wierszy, dla których [value] IS NULL. Jeśli potrzebne są wartości null, musisz być nieco podstępny i użyć wartości, które nigdy nie może pojawić się w tabeli (tu używam pusty ciąg znaków):

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; 

zależności od kolumn będziesz utrzymać po unpivoting, to może być innej opcji (to rozwiązanie zachowa wartości 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; 
Powiązane problemy