روش تغییر جای سطرها با ستون‌ها در SQL

mohsen2 هفته قبل
ارسال شده در
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);

    

این دستورات به شما این امکان را می‌دهد که به سادگی سطرها و ستون‌ها را با توجه به داده‌های موجود در جدول، جابجا کنید.

رای
0
ارسال نظر
مرتب سازی:
اولین نفری باشید که نظر می دهید!