2014-07-18 60 views
8

Ben fazla sütun 3 sütun (Pivot, sütun adı, değer) örneğin bu yüzdenSQL Server

almak için var etrafında bir tablo dönmesine çalışıyorum:

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

olacak : Ben biraz google'dan ama benzer bir durum bulamadı

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

- Pivot ben başarmak istediğim şey olarak ters yönde yapılması gibi görünüyor, özellikle de.

cevap

14

Sütun satırlara dönüştürülmesi, UNPIVOT olarak adlandırılır. Kullandığınız SQL Server sürümünü belirtmediniz, ancak sonuca ulaşmak için birkaç farklı yol var.

Sen UNION ALL ile SELECT kullanabilirsiniz:

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; 

SQL Server 2005+ kullanıyorsanız, o zaman UNPIVOT işlevini kullanabilirsiniz: yerine UNPIVOT fonksiyonunun, Nihayet

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; 

sen Ayrıca VALUES (2008+) veya UNION ALL:

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

Bu sürümlerden herhangi biri, istediğiniz sonucu verecektir. age sütununu varchar'a dökmem gerektiğine dikkat edersiniz. Bunun nedeni, sütunların datatipi/uzunluğunun (unpivot olarak) aynı olması gerektiğinden, son sonuçta bunları tek bir sütuna dönüştüreceksiniz.

+0

Bir SQL 2008 sunucusunda yaptığım testlerde, max_length öğesinin eşleşmesi gerektiğini de belirtmek ister, bu nedenle Cinsiyet char (1) ise, aynı zamanda unpivotun gerçekleşmesi için yayınlanması gerekir. Yine de dış başvurusu denemedim. –

+0

Yani demek istediğim, pivotun nasıl kullanılacağıyla ilgili olarak, sadece zıt uygulamaları bulduktan sonra, UNpivot'a bakmalıydım ... parlak! :) Teşekkürler! – mathematician

+0

@JaazCole Yalnızca veri türünün aynı uzunlukta olmasını gerektiren UNPIVOT'tur - bunu bkz. [DBA.SE] (http://dba.stackexchange.com/questions/54353/why-does-sql-server-require- -veri türü-uzunluk-be--aynı zaman kullanan-unpivo) – Taryn