Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengubah Lajur dan Baris dengan Cekap dalam SQL?

Bagaimanakah Saya Boleh Mengubah Lajur dan Baris dengan Cekap dalam SQL?

Linda Hamilton
Linda Hamiltonasal
2025-01-23 09:47:14690semak imbas

How Can I Efficiently Transpose Columns and Rows in SQL?

Transposisi Lajur dan Baris SQL: Panduan Praktikal

SQL selalunya memerlukan transposing data – menukar orientasi jadual daripada menegak (lajur) kepada mendatar (baris) atau sebaliknya. Walaupun perintah PIVOT wujud, ia boleh menyusahkan. Panduan ini meneroka alternatif yang lebih mudah.

Kaedah 1: UNION ALL, Agregat dan Penyata KES

Pendekatan ini menggunakan UNION ALL untuk menyahpangsi, kemudian fungsi agregat (di sini, SUM) dan pernyataan CASE untuk mengulang:

<code class="language-sql">select name,
  sum(case when color = 'Red' then value else 0 end) Red,
  sum(case when color = 'Green' then value else 0 end) Green,
  sum(case when color = 'Blue' then value else 0 end) Blue
from
(
  select color, Paul value, 'Paul' name
  from yourTable
  union all
  select color, John value, 'John' name
  from yourTable
  union all
  select color, Tim value, 'Tim' name
  from yourTable
  union all
  select color, Eric value, 'Eric' name
  from yourTable
) src
group by name</code>

Kaedah 2: UNPIVOT dan PIVOT Statik

Mengetahui bilangan lajur untuk diubah membolehkan penyelesaian UNPIVOT dan PIVOT statik:

<code class="language-sql">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</code>

Kaedah 3: Pangsi Dinamik untuk Lajur Boleh Ubah

Apabila berurusan dengan bilangan lajur dan warna yang dinamik, SQL dinamik menawarkan penyelesaian:

<code class="language-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)</code>

Kaedah ini menyediakan pendekatan serba boleh untuk transposisi data dalam SQL, menyesuaikan diri dengan pelbagai keperluan manipulasi data.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengubah Lajur dan Baris dengan Cekap dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn