روش تغییر جای سطرها با ستونها در SQL
در SQL، تبدیل سطرها به ستونها (و برعکس) به عنوان ترانهاده شناخته میشود. برای انجام این کار، میتوان از روشهای مختلفی استفاده کرد. اگرچه استفاده از دستورات PIVOT
و UNPIVOT
برای این کار بسیار مؤثر است، اما شاید برای برخی کاربردها پیچیده به نظر برسد. در زیر، چندین روش سادهتری ارائه میشود تا از طریق آنها بتوانید ستونها و سطرها را در SQL راحتتر جابجا کنید.
۱. استفاده از UNION ALL
و CASE
میتوانید از ترکیب UNION ALL
و جملات CASE
استفاده کنید. در ابتدا جدول مورد نظر را که شامل رنگها و مقادیر برای هر شخص (مانند Paul، John، Tim، Eric) است، ایجاد میکنیم:
CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);
INSERT INTO yourTable
([color], [Paul], [John], [Tim], [Eric])
VALUES
('Red', 1, 5, 1, 3),
('Green', 8, 4, 3, 5),
('Blue', 2, 2, 9, 1);
سپس با استفاده از زیر کوئریها، میتوانید مقادیر را به صورت زیر جابجا کنید:
SELECT name,
SUM(CASE WHEN color = 'Red' THEN value ELSE 0 END) AS Red,
SUM(CASE WHEN color = 'Green' THEN value ELSE 0 END) AS Green,
SUM(CASE WHEN color = 'Blue' THEN value ELSE 0 END) AS Blue
FROM
(
SELECT color, Paul AS value, 'Paul' AS name FROM yourTable
UNION ALL
SELECT color, John AS value, 'John' AS name FROM yourTable
UNION ALL
SELECT color, Tim AS value, 'Tim' AS name FROM yourTable
UNION ALL
SELECT color, Eric AS value, 'Eric' AS name FROM yourTable
) src
GROUP BY name;
این روش به شما امکان میدهد که به سادگی مقادیر سطرها را تبدیل کنید و به صورت ستونها مشاهده کنید.
۲. استفاده از PIVOT
اگر مقدار ثابت ستونها را بدانید، میتوانید از دستور PIVOT
استفاده کنید که کار را بسیار سادهتر میکند. بدین صورت:
SELECT name, [Red], [Green], [Blue]
FROM
(
SELECT color, name, value
FROM yourTable
UNPIVOT
(
value FOR name IN ([Paul], [John], [Tim], [Eric])
) unpiv
) src
PIVOT
(
SUM(value) FOR color IN ([Red], [Green], [Blue])
) piv;
این کوئری به شما سطرها را به ستونها تبدیل میکند و نتایج مشابهی را تولید خواهد کرد.
۳. استفاده از SQL پویا
اگر تعداد ستونها و سطرها ناشناخته باشد و بخواهید به صورت داینامیک این ترانهاده را انجام دهید، میتوانید از SQL پویا استفاده کنید:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot AS NVARCHAR(MAX);
SELECT @colsUnpivot = STUFF((SELECT ',' + QUOTENAME(C.name)
FROM sys.columns AS C
WHERE C.object_id = OBJECT_ID('yourTable') AND
C.name <> 'color'
FOR XML PATH('')), 1, 1, '')
SELECT @colsPivot = STUFF((SELECT ','
+ QUOTENAME(color)
FROM yourTable t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '')
SET @query = 'SELECT name, ' + @colsPivot + '
FROM
(
SELECT color, name, value
FROM yourTable
UNPIVOT
(
value FOR name IN (' + @colsUnpivot + ')
) unpiv
) src
PIVOT
(
SUM(value)
FOR color IN (' + @colsPivot + ')
) piv;'
EXEC(@query);
این دستورات به شما این امکان را میدهد که به سادگی سطرها و ستونها را با توجه به دادههای موجود در جدول، جابجا کنید.