Rumah > pangkalan data > tutorial mysql > Bagaimana Mentransmisikan Lajur dan Baris dengan Cekap dalam SQL?

Bagaimana Mentransmisikan Lajur dan Baris dengan Cekap dalam SQL?

Mary-Kate Olsen
Lepaskan: 2025-01-23 11:06:09
asal
264 orang telah melayarinya

How to Efficiently Transpose Columns and Rows in SQL?

Cara mudah untuk menukar baris dan lajur SQL

Walaupun fungsi PIVOT SQL nampaknya sesuai untuk penukaran lajur-lajur, kerumitannya mungkin terlalu tinggi. Jika anda mahukan cara yang lebih mudah untuk mencapai ini, pertimbangkan alternatif berikut:

Gunakan UNION ALL, agregat fungsi dan penyata KES

Kaedah ini menggunakan UNION ALL untuk mengembangkan data, dan kemudian menggunakan fungsi agregat dan pernyataan CASE untuk memutar:

<code class="language-sql">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
) AS src
GROUP BY name</code>
Salin selepas log masuk

Dekonstruksi statik dan perspektif

Jika anda tahu nilai yang ingin anda tukar, gunakan nilai berkod keras untuk memusnahkan dan memutar:

<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)
  ) AS unpiv
) AS src
PIVOT
(
  SUM(value)
  FOR color IN ([Red], [Green], [Blue])
) AS piv</code>
Salin selepas log masuk

Perspektif Dinamik

Untuk bilangan lajur dan warna yang tidak diketahui, gunakan SQL dinamik untuk menjana senarai yang dinyahbina dan dipangsi:

<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 AS 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 + ')
    ) AS unpiv
  ) AS src
  PIVOT
  (
    SUM(value)
    FOR color IN (' + @colsPivot + ')
  ) AS piv'

EXEC(@query)</code>
Salin selepas log masuk

Ketiga-tiga kaedah menghasilkan keputusan berikut:

NAME RED GREEN BLUE
Eric 3 5 1
John 5 4 2
Paul 1 8 2
Tim 1 3 9

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan