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!