SQL에서 여러 열이 있는 여러 행을 동적으로 그룹화하고 병합하는 방법은 무엇입니까?
SQL의 여러 행과 열의 동적 그룹화 및 병합
표 형식 데이터로 작업할 때 하나 이상의 열을 기준으로 레코드를 그룹화하고 결과를 여러 열이 포함된 단일 행으로 병합해야 하는 경우가 많습니다. 이는 각 그룹과 관련된 여러 값을 처리할 때 특히 유용합니다.
각 행이 특정 테스트 유형과 해당 결과를 나타내는 테스트 결과가 포함된 테이블이 있다고 가정해 보겠습니다. 예를 들어 "결과" 테이블에는 다음 스키마가 있을 수 있습니다.
CREATE TABLE Result( WorkOrder varchar(10), TestType varchar(20), Result decimal(10,2) );
및 다음 데이터:
INSERT INTO Result (WorkOrder, TestType, Result) VALUES ('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)
이러한 결과를 "TestType"별로 그룹화하고 각 결과에 대해 여러 열이 포함된 새 행을 생성하려면 "크로스탭" 또는 "피벗" 작업을 사용할 수 있습니다. 한 가지 접근 방식은 "ROW_NUMBER" 함수를 사용하여 그룹 내의 각 결과에 시퀀스 번호를 할당한 다음 조건부 집계를 사용하여 필요한 값을 추출하는 것입니다.
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;
이 쿼리는 다음과 같은 출력을 생성합니다.
<code>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</code>
그러나 이 방법은 고정된 결과 수로 제한됩니다. 원하는 수의 결과를 수용할 수 있는 동적 솔루션을 만들기 위해 "교차 적용 계산 테이블"이라는 기술을 사용할 수 있습니다.
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 --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;
이 쿼리는 "카운트 테이블"을 사용하여 테이블의 최대 결과 수를 기반으로 SQL 문을 동적으로 생성하는 정수 시퀀스를 생성합니다. 이 기술을 사용하면 원하는 수의 결과를 단일 행으로 결합할 수 있습니다.
이러한 방법을 사용하면 표 형식의 데이터를 보다 체계적이고 의미 있는 형식으로 효과적으로 그룹화하고 병합하여 데이터 분석 및 시각화를 단순화할 수 있습니다.
위 내용은 SQL에서 여러 열이 있는 여러 행을 동적으로 그룹화하고 병합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Alter Table 문을 사용하여 MySQL에서 테이블을 어떻게 변경합니까?

MySQL의 문제를 해결하는 방법 공유 라이브러리를 열 수 없습니다.

Linux에서 MySQL을 실행합니다 (Phpmyadmin이있는 Podman 컨테이너가 포함되지 않음)

인기있는 MySQL GUI 도구는 무엇입니까 (예 : MySQL Workbench, Phpmyadmin)?
