Sütun adıyla özetlemeyi kaldırın


127

StudentMarksSütunlu bir tablom var Name, Maths, Science, English. Veri gibidir

Name,  Maths, Science, English  
Tilak, 90,    40,      60  
Raj,   30,    20,      10

Aşağıdaki gibi düzenlenmesini istiyorum:

Name,  Subject,  Marks
Tilak, Maths,    90
Tilak, Science,  40
Tilak, English,  60

Unpivot ile Ad, İşaretleri düzgün bir şekilde alabiliyorum, ancak kaynak tablodaki sütun adını Subjectistenen sonuç kümesindeki sütuna alamıyorum .

Bunu nasıl başarabilirim?

Şimdiye kadar aşağıdaki sorguya ulaştım (İsim, İşaret almak için)

select Name, Marks from studentmarks
Unpivot
(
  Marks for details in (Maths, Science, English)

) as UnPvt

1
Şimdiye kadar yaptıklarınızı gönderebilir misiniz? Sorgu / çıktı.
Hart CO

Yanıtlar:


204

Sorgunuz çok yakın. subjectSon seçim listesinde bulunan aşağıdakileri kullanabilmelisiniz :

select u.name, u.subject, u.marks
from student s
unpivot
(
  marks
  for subject in (Maths, Science, English)
) u;

Demolu SQL Fiddle'ı görün


@bluefeet İsimleri belirtmenize gerek kalmayacak bir yol var mı (Matematik, Fen Bilimleri, İngilizce)? Bu işlemi, hepsi aynı yapıya sahip ancak farklı sütun adlarına sahip birçok tabloya yapıyorum.
LBogaardt

1
@LBogaardt Hayır, dahil edilecek sütunları açıkça tanımlamanız gerekir.
jjjjjjjjjjj

Cevabıma bir göz atın @LBogaardt burada , sütun adları belirtmeden UNPIVOT dinamik sql kullanabilirsiniz.
Taryn

8

Aşağıdaki kodla bir mantık dizisi kullanarak standart sql un-pivoting yöntemini de deneyebilirsiniz. Aşağıdaki kodun 3 adımı vardır:

  1. çapraz birleştirmeyi kullanarak her satır için birden fazla kopya oluşturun (bu durumda da konu sütunu oluşturun)
  2. Sütun "işaretleri" oluşturun ve büyük / küçük harf ifadesini kullanarak ilgili değerleri doldurun (örneğin: konu bilimse, bilim sütunundan değer seçin)
  3. tüm boş kombinasyonları kaldırın (varsa, temel tabloda kesinlikle boş değer yoksa tablo ifadesinden tamamen kaçınılabilir)

     select *
     from 
     (
        select name, subject,
        case subject
        when 'Maths' then maths
        when 'Science' then science
        when 'English' then english
        end as Marks
    from studentmarks
    Cross Join (values('Maths'),('Science'),('English')) AS Subjct(Subject)
    )as D
    where marks is not null;

Bu aynı zamanda herhangi bir RDBMS ile de çalışır! VALUES, mevcut olmadığında, SELECT ... UNION ... SELECT ... CROSS JOIN'in performansını merak eden bir alt sorgu ile değiştirilebilir ...
Cristi S.

0

SEÇ * Öğrenciden

UNPIVOT ((Matematik, Fen, İngilizce) konularındaki işaretler);


1
Bu, neredeyse 6 yıl önce yayınlanan kabul edilmiş ve yüksek oy alan cevapla aynı cevap mı?
ImaginaryHuman072889

0

Çapraz birleştirmeyi kullanmanın başka bir yolu, çapraz birleşim içinde sütun adları belirtmektir.

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.