집 >데이터 베이스 >MySQL 튜토리얼 >SQL Server의 테스트 유형에 따라 여러 행을 하나의 행으로 동적으로 병합하는 방법은 무엇입니까?
질문:
Result
, WorkOrder
및 TestType
열이 있는 Result
이라는 테이블이 있습니다. TestType
열을 기준으로 그룹화하고 동일한 TestType
이 포함된 여러 행을 하나의 행으로 병합하려고 합니다. 그러나 각 TestType
에 대해 얼마나 많은 Result
열이 있는지 알 수 없습니다.
해결책:
이 문제를 해결하기 위해 동적 SQL을 사용할 수 있습니다. 다음 쿼리는 최대 100개의 결과에 대해 작동합니다. 결과가 100개가 넘는 경우 CTE Tally
의 N에 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>
위 내용은 SQL Server의 테스트 유형에 따라 여러 행을 하나의 행으로 동적으로 병합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!