질문:
특정 열을 기준으로 데이터를 그룹화하고 동일한 열 값을 가진 여러 행을 단일 행으로 병합하여 동시에 여러 열을 생성하는 방법은 무엇입니까? 특히 "TestType" 열을 기준으로 그룹화하고 "Result" 열을 일치하는 각 "TestType" 값에 대한 별도의 열로 분할해야 합니다.
정답:
이는 SQL Server의 크로스탭(PIVOT) 을 사용하여 수행할 수 있습니다. 그러나 그룹당 열 수가 동적이면(예: 변경될 수 있음) 보다 유연한 솔루션이 필요합니다.
FOR XML PATH를 사용하는 동적 솔루션:
줄 번호로 CTE 만들기:
<code class="language-sql">WITH RNs AS ( SELECT WorkOrder, TestType, Result, ROW_NUMBER() OVER (PARTITION BY WorkOrder, TestType ORDER BY (SELECT NULL)) AS RN FROM dbo.Result )</code>
동적 SQL 문 작성:
<code class="language-sql">DECLARE @SQL nvarchar(MAX); DECLARE @CRLF nvarchar(2) = CHAR(13) + CHAR(10); --回车换行符 -- 获取任何“TestType”的最大结果数 SELECT @MaxTally = MAX(C) FROM ( SELECT COUNT(*) AS C FROM dbo.Result GROUP BY WorkOrder, TestType ); -- 创建具有最大行数的计数表 WITH Tally AS ( SELECT TOP (@MaxTally) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N), (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N) ) -- 构建动态SQL语句 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 ' + @CRLF + N' FROM dbo.Result)' + @CRLF + N'SELECT WorkOrder, ' + @CRLF + N' TestType, ' + @CRLF + -- 使用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;'</code>
동적 SQL 문 실행:
<code class="language-sql">PRINT @SQL; -- 查看SQL语句 EXEC sys.sp_executesql @SQL;</code>
이 솔루션은 각 "TestType"에 대한 최대 결과 수를 기반으로 열을 동적으로 생성하여 원하는 결과를 얻습니다. @CRLF
더 나은 코드 가독성과 향상된 플랫폼 간 호환성을 위해 변수가 코드에 추가되었습니다.
위 내용은 그룹화 열을 기반으로 동적으로 생성된 열을 사용하여 여러 SQL 행을 하나로 병합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!