Khi áp dụng UNPIVOT
hàm cho dữ liệu không được chuẩn hóa, SQL Server yêu cầu kiểu dữ liệu và độ dài giống nhau. Tôi hiểu tại sao kiểu dữ liệu phải giống nhau nhưng tại sao UNPIVOT yêu cầu độ dài phải giống nhau?
Hãy nói rằng tôi có dữ liệu mẫu sau mà tôi cần hủy bỏ:
CREATE TABLE People
(
PersonId int,
Firstname varchar(50),
Lastname varchar(25)
)
INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');
Nếu tôi cố gắng UNPIVOT Firstname
và Lastname
các cột tương tự như:
select PersonId, ColumnName, Value
from People
unpivot
(
Value
FOR ColumnName in (FirstName, LastName)
) unpiv;
Máy chủ SQL tạo ra lỗi:
Msg 8167, Cấp 16, Bang 1, Dòng 6
Loại cột "Họ" xung đột với loại cột khác được chỉ định trong danh sách UNPIVOT.
Để khắc phục lỗi, trước tiên chúng ta phải sử dụng truy vấn con để truyền Lastname
cột có cùng độ dài như Firstname
sau:
select PersonId, ColumnName, Value
from
(
select personid,
firstname,
cast(lastname as varchar(50)) lastname
from People
) d
unpivot
(
Value FOR
ColumnName in (FirstName, LastName)
) unpiv;
Trước khi UNPIVOT được giới thiệu trong SQL Server 2005, tôi sẽ sử dụng a SELECT
với UNION ALL
để hủy xoay firstname
/ lastname
cột và truy vấn sẽ chạy mà không cần phải chuyển đổi các cột thành cùng độ dài:
select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;
Xem SQL Fiddle với Demo .
Chúng tôi cũng có thể hủy thành công dữ liệu bằng cách sử dụng CROSS APPLY
mà không có cùng độ dài trên kiểu dữ liệu:
select PersonId, columnname, value
from People
cross apply
(
select 'firstname', firstname union all
select 'lastname', lastname
) c (columnname, value);
Xem SQL Fiddle với Demo .
Tôi đã đọc qua MSDN nhưng tôi không tìm thấy bất cứ điều gì giải thích lý do buộc độ dài trên kiểu dữ liệu là như nhau.
Logic đằng sau yêu cầu cùng độ dài khi sử dụng UNPIVOT là gì?