Rumah >pangkalan data >tutorial mysql >Bagaimana Mentransmisikan Lajur dan Baris dengan Cekap dalam 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>
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>
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>
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!