เมื่อใช้UNPIVOT
ฟังก์ชันกับข้อมูลที่ไม่ได้ทำให้เป็นมาตรฐาน SQL Server ต้องการให้ประเภทข้อมูลและความยาวเหมือนกัน ฉันเข้าใจว่าทำไมประเภทข้อมูลต้องเหมือนกัน แต่ทำไม UNPIVOT จึงต้องมีความยาวเท่ากัน
สมมติว่าฉันมีข้อมูลตัวอย่างต่อไปนี้ที่ฉันต้องการยกเลิกการหมุน:
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');
หากฉันพยายาม UNPIVOT Firstname
และLastname
คอลัมน์คล้ายกับ:
select PersonId, ColumnName, Value
from People
unpivot
(
Value
FOR ColumnName in (FirstName, LastName)
) unpiv;
SQL Server สร้างข้อผิดพลาด:
ข่าวสารเกี่ยวกับ 8167 ระดับ 16 สถานะ 1 สาย 6
ประเภทของคอลัมน์ "นามสกุล" ขัดแย้งกับประเภทของคอลัมน์อื่น ๆ ที่ระบุในรายการ UNPIVOT
ในการแก้ไขข้อผิดพลาดเราจะต้องใช้แบบสอบถามย่อยเพื่อเลือกLastname
คอลัมน์ก่อนเพื่อให้มีความยาวเท่ากับFirstname
:
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;
ก่อนที่จะถูกนำ Unpivot ใน SQL Server 2005 ผมจะใช้SELECT
กับUNION ALL
การ Unpivot firstname
/ lastname
คอลัมน์และแบบสอบถามจะทำงานได้โดยไม่ต้องแปลงคอลัมน์ความยาวเดียวกัน:
select personid, 'firstname' ColumnName, firstname value
from People
union all
select personid, 'LastName', LastName
from People;
ดูซอ SQL กับการสาธิต
นอกจากนี้เรายังสามารถยกเลิกการย้ายข้อมูลโดยใช้CROSS APPLY
โดยไม่ต้องมีความยาวเท่ากันในประเภทข้อมูล:
select PersonId, columnname, value
from People
cross apply
(
select 'firstname', firstname union all
select 'lastname', lastname
) c (columnname, value);
ดูซอ SQL กับการสาธิต
ฉันอ่านผ่าน MSDN แล้ว แต่ฉันไม่พบสิ่งใดที่อธิบายเหตุผลในการบังคับให้ความยาวของประเภทข้อมูลนั้นเท่ากัน
ตรรกะเบื้องหลังที่ต้องใช้ความยาวเท่ากันเมื่อใช้ UNPIVOT คืออะไร