Batalkan kawin dengan nama kolom


127

Saya punya tabel StudentMarksdengan kolom Name, Maths, Science, English. Data seperti

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

Saya ingin mengaturnya seperti berikut:

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

Dengan unpivot saya bisa mendapatkan Nama, Menandai dengan benar, tetapi tidak bisa mendapatkan nama kolom di tabel sumber ke Subjectkolom di set hasil yang diinginkan.

Bagaimana saya bisa mencapai ini?

Sejauh ini saya telah mencapai permintaan berikut (untuk mendapatkan Nama, Tanda)

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

) as UnPvt

1
Bisakah Anda memposting apa yang telah Anda lakukan sejauh ini? permintaan / keluaran.
Hart CO

Jawaban:


204

Permintaan Anda sangat dekat. Anda harus dapat menggunakan yang berikut ini yang termasuk subjectdalam daftar pilih terakhir:

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

Lihat SQL Fiddle dengan demo


@bluefeet Apakah ada cara sedemikian rupa sehingga Anda tidak perlu menentukan nama (Matematika, Sains, Bahasa Inggris)? Saya melakukan operasi ini ke banyak tabel, semua dengan struktur yang sama tetapi dengan nama kolom yang berbeda.
LBogaardt

1
@ LBogaardt Tidak, Anda perlu menentukan kolom yang akan disertakan secara eksplisit.
jjjjjjjjjjj

@ LBogaardt Lihatlah jawaban saya di sini , Anda dapat menggunakan sql dinamis untuk tidak berporos tanpa menentukan nama kolom.
Taryn

8

Anda juga dapat mencoba metode un-pivoting sql standar dengan menggunakan urutan logika dengan kode berikut .. Kode berikut memiliki 3 langkah:

  1. buat banyak salinan untuk setiap baris menggunakan cross join (juga buat kolom subjek dalam kasus ini)
  2. buat kolom "tanda" dan isi nilai-nilai yang relevan menggunakan ekspresi kasus (mis: jika subjek adalah sains maka pilih nilai dari kolom sains)
  3. hapus semua kombinasi nol (jika ada, ekspresi tabel dapat sepenuhnya dihindari jika tidak ada nilai null di tabel dasar)

     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;
    

Ini juga berfungsi dengan RDBMS apa pun! NILAI, jika tidak tersedia, dapat diganti dengan subquery dengan SELECT ... UNION ... SELECT ... Ingin tahu tentang kinerja CROSS JOIN itu ...
Cristi S.

0

PILIH * DARI siswa

UNPIVOT (Marks FOR mata pelajaran dalam (Matematika, Sains, Bahasa Inggris));


1
Ini sudah jawaban yang sama dengan jawaban yang diterima dan sangat tervvotasikan diposting hampir 6 tahun yang lalu?
ImaginaryHuman072889

0

Cara lain menggunakan cross join adalah dengan menentukan nama kolom di dalam cross join

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.