Hủy liên kết với tên cột


127

Tôi có một bảng StudentMarksvới các cột Name, Maths, Science, English. Dữ liệu giống như

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

Tôi muốn sắp xếp nó như sau:

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

Với unpOLL tôi có thể lấy Tên, Đánh dấu đúng, nhưng không thể lấy tên cột trong bảng nguồn vào Subjectcột trong tập kết quả mong muốn.

Làm thế nào tôi có thể đạt được điều này?

Cho đến nay tôi đã đạt được truy vấn sau (để lấy Tên, Nhãn hiệu)

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

) as UnPvt

1
Bạn có thể đăng những gì bạn đã làm cho đến nay? truy vấn / đầu ra.
Hart CO

Câu trả lời:


204

Truy vấn của bạn rất gần. Bạn sẽ có thể sử dụng những thứ sau đây bao gồm subjecttrong danh sách chọn cuối cùng:

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

Xem SQL Fiddle với bản demo


@bluefeet Có cách nào mà bạn không cần chỉ định tên (Toán, Khoa học, Tiếng Anh) không? Tôi đang thực hiện thao tác này cho nhiều bảng, tất cả có cùng cấu trúc nhưng với các tên cột khác nhau.
LBogaardt

1
@LBogaardt Không, bạn cần xác định rõ ràng các cột cần bao gồm.
jjjjjjjjjjj

@LBogaardt Hãy xem câu trả lời của tôi ở đây , bạn có thể sử dụng sql động để hủy trục mà không chỉ định tên cột.
Taryn

8

Bạn cũng có thể thử phương pháp không xoay vòng chuẩn sql bằng cách sử dụng chuỗi logic với mã sau đây .. Đoạn mã sau có 3 bước:

  1. tạo nhiều bản sao cho mỗi hàng bằng cách sử dụng liên kết chéo (cũng tạo cột chủ đề trong trường hợp này)
  2. tạo cột "đánh dấu" và điền vào các giá trị liên quan bằng cách sử dụng biểu thức trường hợp (ví dụ: nếu chủ đề là khoa học thì chọn giá trị từ cột khoa học)
  3. xóa mọi kết hợp null (nếu tồn tại, có thể tránh hoàn toàn biểu thức bảng nếu hoàn toàn không có giá trị null trong bảng cơ sở)

     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;
    

Điều này cũng hoạt động với bất kỳ RDBMS! GIÁ TRỊ, khi không có sẵn, có thể được thay thế bằng truy vấn con bằng CHỌN ... ĐOÀN ... CHỌN ... Tự hỏi về hiệu suất của CROSS THAM GIA đó ...
Cristi S.

0

CHỌN * TỪ học sinh

UNPIVOT (Đánh dấu cho các môn học trong (Toán, Khoa học, Tiếng Anh));


1
Đây đã là câu trả lời giống như câu trả lời được chấp nhận và đánh giá cao được đăng gần 6 năm trước?
ImaginaryHuman072889

0

Một cách khác để sử dụng tham gia chéo sẽ là chỉ định tên cột trong liên kết chéo

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.