Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menggabungkan Berbilang Baris Secara Dinamik menjadi Satu Baris Berdasarkan Jenis Ujian dalam Pelayan SQL?

Bagaimana untuk Menggabungkan Berbilang Baris Secara Dinamik menjadi Satu Baris Berdasarkan Jenis Ujian dalam Pelayan SQL?

Linda Hamilton
Linda Hamiltonasal
2025-01-22 01:08:37823semak imbas

How to Dynamically Merge Multiple Rows into One Row Based on Test Type in SQL Server?

Gabungkan berbilang baris secara dinamik ke dalam satu baris berdasarkan jenis ujian (SQL Server)

Soalan:

Kami mempunyai jadual bernama Result dengan lajur WorkOrder, TestType dan Result. Kami mahu mengumpulkan mengikut lajur TestType dan menggabungkan berbilang baris dengan TestType yang sama ke dalam satu baris. Walau bagaimanapun, kami tidak tahu berapa banyak TestType lajur yang akan ada untuk setiap Result.

Penyelesaian:

Untuk menyelesaikan masalah ini, kita boleh menggunakan SQL dinamik. Pertanyaan berikut berfungsi untuk sehingga 100 hasil. Untuk lebih daripada 100 hasil, kami boleh menambah lebih banyak Tally kepada N dalam CTE CROSS JOIN.

<code class="language-sql">DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10),
        @MaxTally int;

SELECT @MaxTally = MAX(C)
FROM (SELECT COUNT(*) AS C
      FROM dbo.Result
      GROUP BY WorkOrder,
               TestType) R;

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (@MaxTally) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2) --100 行,更多行需要添加更多 N
SELECT @SQL = N'WITH RNs AS(' + @CRLF +
              N'    SELECT WorkOrder,' + @CRLF +
              N'           TestType,' + @CRLF +
              N'           Result,' + @CRLF +
              N'           ROW_NUMBER() OVER (PARTITION BY WorkOrder, TestType ORDER BY (SELECT NULL)) AS RN --ORDER BY 应为您的 ID/始终递增列' + @CRLF +
              N'    FROM dbo.Result)' + @CRLF +
              N'SELECT WorkOrder,' + @CRLF +
              N'       TestType,' + @CRLF +
              --由于不知道 SQL Server 版本,因此使用 FOR XML PATH
              STUFF((SELECT N',' + @CRLF +
                            CONCAT(N'       MAX(CASE RN WHEN ',T.I,N' THEN Result END) AS Result',T.I)
                     FROM Tally T
                     ORDER BY T.I ASC
                     FOR XML PATH(N''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,3,N'') + @CRLF +
              N'FROM RNs R' + @CRLF +
              N'GROUP BY WorkOrder,' + @CRLF +
              N'         TestType;';

PRINT @SQL; --您的好帮手。

EXEC sys.sp_executesql @SQL;</code>

Atas ialah kandungan terperinci Bagaimana untuk Menggabungkan Berbilang Baris Secara Dinamik menjadi Satu Baris Berdasarkan Jenis Ujian dalam Pelayan 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