راهنمای جامع ادغام ستونهای متعدد SQL در یک ستون با UNION ALL، UNPIVOT و CROSS APPLY
در هنگام کار با SQL Server، اغلب نیاز داریم تا ساختار دادهها را به شکلی متفاوت از آنچه معمولاً استفاده میکنیم، تغییر دهیم. این وضعیت زمانی رخ میدهد که چندین ستون، دادههای از یک نوع را نشان میدهند و قصد داریم آنها را در یک ستون واحد با برچسب متناظر برای هر ستون ادغام کنیم. در ادامه، دادههای نمونهای که برای این مثالها استفاده خواهیم کرد، آورده شده است:
CREATE TABLE #Employee (EmployeeId INT, Col1 VARCHAR(50), Col2 VARCHAR(50), Col3 VARCHAR(50), Col4 VARCHAR(50), Col5 VARCHAR(50));
INSERT INTO #Employee VALUES (1,'A','B','C','D','E'), (2,'AA','BB','CC','DD','EE'), (3,'AAA','BBB','CCC','DDD','EEE');
SELECT * FROM #Employee;
کوئری بالا نتیجه زیر را نمایش میدهد:
EmployeeId | Col1 | Col2 | Col3 | Col4 | Col5 |
---|---|---|---|---|---|
1 | A | B | C | D | E |
2 | AA | BB | CC | DD | EE |
3 | AAA | BBB | CCC | DDD | EEE |
روش ۱: استفاده از UNION ALL در SQL Server برای ادغام ستونها
یکی از رایجترین راهها برای تبدیل چندین ستون به یک ستون واحد در SQL Server، استفاده از اپراتور UNION ALL
است. این روش شامل انتخاب هر ستون به صورت جداگانه و سپس ترکیب نتایج با یکدیگر است. این رویکرد به ویژه برای مجموعه دادههای کوچکتر و زمانی که نیاز به کنترل دقیق بر نام ستونها و ترتیب آنها دارید، مفید است. این کوئری تمام رکوردهای جدول را گرفته و برای هر ستون جداگانه، یک رکورد جدید با مقادیر و نام ستون متناظر ایجاد میکند.
SELECT EmployeeId, 'Col1' AS ColumnName, Col1 AS ColumnValue
FROM #Employee
UNION ALL
SELECT EmployeeId, 'Col2' AS ColumnName, Col2 AS ColumnValue
FROM #Employee
UNION ALL
SELECT EmployeeId, 'Col3' AS ColumnName, Col3 AS ColumnValue
FROM #Employee
UNION ALL
SELECT EmployeeId, 'Col4' AS ColumnName, Col4 AS ColumnValue
FROM #Employee
UNION ALL
SELECT EmployeeId, 'Col5' AS ColumnName, Col5 AS ColumnValue
FROM #Employee
ORDER BY EmployeeId, ColumnName;
روش ۲: استفاده از UNPIVOT در SQL Server برای تغییر شکل داده
دستور UNPIVOT
در SQL Server ابزار قدرتمندی برای تغییر شکل دادهها است که به شما امکان میدهد چندین ستون را به ردیفها تبدیل کنید. این روش برای زمانی که تعداد زیادی ستون برای ادغام دارید و میخواهید یک راهحل مقیاسپذیر و خوانا داشته باشید، بسیار مؤثر است. UNPIVOT
دو ستون جدید ایجاد میکند: یکی برای نام ستونهای اصلی و دیگری برای مقادیر آنها. در مثال زیر، ما ستونهای Col1
تا Col5
را به یک ستون ColumnValue
تبدیل میکنیم و نام اصلی هر ستون را در ColumnName
قرار میدهیم.
SELECT EmployeeId, ColumnName, ColumnValue
FROM #Employee
UNPIVOT
(
ColumnValue FOR ColumnName IN (Col1, Col2, Col3, Col4, Col5)
) AS UnpivotTable
ORDER BY EmployeeId, ColumnName;
روش ۳: استفاده از CROSS APPLY و VALUES در SQL Server برای انعطافپذیری بیشتر
استفاده از CROSS APPLY
همراه با سازنده VALUES
یک راهکار بسیار انعطافپذیر برای ادغام ستونها در SQL Server ارائه میدهد. این تکنیک به شما امکان میدهد تا یک جدول مجازی از جفتهای نام-مقدار ایجاد کنید و سپس آن را به هر ردیف از جدول اصلی خود اعمال کنید. این روش، به خصوص زمانی که نیاز به انجام عملیات پیچیدهتری بر روی مقادیر دارید یا میخواهید ستونهای با نوع دادههای مختلف را ترکیب کنید، مفید است. این رویکرد به شما کنترل دقیقتری بر روی نحوه نمایش دادهها میدهد و میتواند برای سناریوهای پیشرفتهتر تغییر شکل دادهها، بهینهسازی کوئری را به همراه داشته باشد.
SELECT E.EmployeeId, V.ColumnName, V.ColumnValue
FROM #Employee E
CROSS APPLY
(VALUES ('Col1', E.Col1), ('Col2', E.Col2), ('Col3', E.Col3), ('Col4', E.Col4), ('Col5', E.Col5))
AS V(ColumnName, ColumnValue)
ORDER BY E.EmployeeId, V.ColumnName;