Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Pivot Baris ke Lajur dalam SQL Tanpa Pengagregatan?

Bagaimana untuk Pivot Baris ke Lajur dalam SQL Tanpa Pengagregatan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-08 00:21:41786semak imbas

How to Pivot Rows to Columns in SQL Without Aggregation?

operasi baris ke lajur SQL tanpa fungsi agregat

Dalam pemprosesan data, menukar data baris kepada data lajur (baris ke lajur) adalah keperluan biasa, yang amat berguna untuk meringkaskan atau menganalisis data berdasarkan berbilang atribut.

Fungsi PIVOT dalam SQL boleh melaksanakan operasi baris ke lajur. Walau bagaimanapun, fungsi PIVOT selalunya perlu digabungkan dengan fungsi agregat (seperti MAX atau MIN) untuk mengendalikan nilai pangsi. Tetapi dalam beberapa kes, kami ingin melakukan pemutaran nilai mudah tanpa sebarang operasi pengagregatan.

Sebagai contoh, pertimbangkan jadual bernama "TEST" dengan lajur berikut:

  • TEST_NAME
  • SBNO
  • VAL

Lajur VAL mengandungi pelbagai jenis data (integer, perpuluhan atau varchar). Matlamatnya adalah untuk mengubah lajur TEST_NAME kepada tiga lajur berasingan (Ujian1, Ujian2 dan Ujian3) tanpa sebarang pengagregatan:

<code>源表

╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║  VAL  ║
╠═══════════╬══════╬═══════╣
║ Test1     ║    1 ║ 0.304 ║
║ Test1     ║    2 ║ 0.31  ║
║ Test1     ║    3 ║ 0.306 ║
║ Test2     ║    1 ║ 2.3   ║
║ Test2     ║    2 ║ 2.5   ║
║ Test2     ║    3 ║ 2.4   ║
║ Test3     ║    1 ║ PASS  ║
║ Test3     ║    2 ║ PASS  ║
╚═══════════╩══════╩═══════╝</code>
<code>目标输出

╔══════════════════════════╗
║ SBNO Test1 Test2   Test3 ║
╠══════════════════════════╣
║ 1    0.304  2.3    PASS  ║
║ 2    0.31   2.5    PASS  ║
║ 3    0.306  2.4    NULL  ║
╚══════════════════════════╝</code>

Untuk mencapai ini tanpa menggunakan sebarang fungsi agregat, kita boleh menggunakan SQL dinamik:

<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME)
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'')

set @query = 'SELECT sbno,' + @cols + '
             from
             (
                select test_name, sbno, val
                from yourtable
            ) x
            pivot
            (
                max(val)
                for test_name in (' + @cols + ')
            ) p '

execute(@query)</code>

Pertanyaan ini menjana pernyataan SQL dinamik yang mengandungi semua nilai unik TEST_NAME sebagai nama lajur. Ia kemudian menggunakan fungsi PIVOT untuk menukar data baris kepada lajur tanpa menggunakan sebarang pengagregatan.

Menjalankan SQL ini akan menghasilkan output yang diingini, iaitu jadual dengan lajur pangsi Test1, Test2 dan Test3 yang mengandungi nilai VAL yang sepadan daripada jadual asal.

Output yang disemak ini mengekalkan makna asal sambil menggunakan perkataan dan struktur ayat yang sedikit berbeza. Butiran teknikal kekal tidak berubah.

Atas ialah kandungan terperinci Bagaimana untuk Pivot Baris ke Lajur dalam SQL Tanpa Pengagregatan?. 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