SQL Server에서 열을 그룹화하고 여러 행을 여러 열이 있는 단일 행으로 병합
경우에 따라 특정 열을 기준으로 데이터를 그룹화하고 관련 행의 여러 값을 여러 열이 포함된 단일 행으로 집계할 수 있습니다. 다음 상황을 예로 들어보겠습니다.
다음 열을 포함하는 Result라는 테이블이 있습니다.
결과 테이블의 데이터는 다음과 같습니다.
WorkOrder | TestType | Result |
---|---|---|
HP19002316 | VitaminA | 10.3 |
HP19002316 | VitaminA | 11.3 |
HP19002316 | VitaminA | 12.3 |
HP19002316 | VitaminB | 13.4 |
HP19002316 | VitaminB | 14.4 |
HP19002316 | VitaminC | 15.5 |
HP19002316 | VitaminD | 17.0 |
데이터를 다음 구조로 다시 포맷하려고 합니다.
WorkOrder | TestType | Result1 | Result2 | Result3 |
---|---|---|---|---|
HP19002316 | VitaminA | 10.3 | 11.3 | 12.3 |
HP19002316 | VitaminB | 13.4 | 14.4 | NULL |
HP19002316 | VitaminC | 15.5 | NULL | NULL |
HP19002316 | VitaminD | 17.0 | NULL | NULL |
여기서 과제는 결과를 TestType별로 그룹화하고 여러 결과 값을 Result1, Result2 등으로 라벨이 지정된 별도의 열로 결합하는 것입니다.
비동적 솔루션
결과 수가 고정된 경우 다음과 같은 간단한 접근 방식을 사용할 수 있습니다.
WITH RNs AS ( SELECT WorkOrder, TestType, Result, ROW_NUMBER() OVER (PARTITION BY WorkOrder, TestType ORDER BY (SELECT NULL)) AS RN FROM dbo.Result ) SELECT WorkOrder, TestType, MAX(CASE RN WHEN 1 THEN Result END) AS Result1, MAX(CASE RN WHEN 2 THEN Result END) AS Result2, MAX(CASE RN WHEN 3 THEN Result END) AS Result3 FROM RNs R GROUP BY WorkOrder, TestType;
이 쿼리는 결과를 Result1, Result2, Result3의 세 열로 제한합니다. 그러나 결과의 양이 동적으로 증가하려면 더 복잡한 솔루션이 필요합니다.
동적 솔루션
불확실한 수의 결과를 처리하려면 필요한 열을 자동으로 생성하는 동적 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) 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 + --由于不知道 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;
이 쿼리는 모든 TestType에 대한 최대 결과 수를 기반으로 충분한 수의 결과 열을 생성하는 동적 SQL 문을 생성합니다. Tally라는 CTE(Common Table Expression)를 사용하여 Result 열의 열 번호를 동적으로 생성합니다.
위 내용은 SQL에서 열을 그룹화하고 여러 행을 여러 열이 있는 단일 행으로 결합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!