> 데이터 베이스 > MySQL 튜토리얼 > SQL에서 여러 열이 있는 여러 행을 동적으로 그룹화하고 병합하는 방법은 무엇입니까?

SQL에서 여러 열이 있는 여러 행을 동적으로 그룹화하고 병합하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-22 01:02:08
원래의
931명이 탐색했습니다.

How to Dynamically Group and Merge Multiple Rows with Multiple Columns in SQL?

SQL의 여러 행과 열의 동적 그룹화 및 병합

표 형식 데이터로 작업할 때 하나 이상의 열을 기준으로 레코드를 그룹화하고 결과를 여러 열이 포함된 단일 행으로 병합해야 하는 경우가 많습니다. 이는 각 그룹과 관련된 여러 값을 처리할 때 특히 유용합니다.

각 행이 특정 테스트 유형과 해당 결과를 나타내는 테스트 결과가 포함된 테이블이 있다고 가정해 보겠습니다. 예를 들어 "결과" 테이블에는 다음 스키마가 있을 수 있습니다.

<code class="language-sql">CREATE TABLE Result(
  WorkOrder varchar(10),
  TestType varchar(20),
  Result decimal(10,2)
);</code>
로그인 후 복사

및 다음 데이터:

<code class="language-sql">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)</code>
로그인 후 복사

이러한 결과를 "TestType"별로 그룹화하고 각 결과에 대해 여러 열이 포함된 새 행을 생성하려면 "크로스탭" 또는 "피벗" 작업을 사용할 수 있습니다. 한 가지 접근 방식은 "ROW_NUMBER" 함수를 사용하여 그룹 내의 각 결과에 시퀀스 번호를 할당한 다음 조건부 집계를 사용하여 필요한 값을 추출하는 것입니다.

<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)
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>
로그인 후 복사

이 쿼리는 다음과 같은 출력을 생성합니다.

<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>
로그인 후 복사

그러나 이 방법은 고정된 결과 수로 제한됩니다. 원하는 수의 결과를 수용할 수 있는 동적 솔루션을 만들기 위해 "교차 적용 계산 테이블"이라는 기술을 사용할 수 있습니다.

<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) 
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 문을 동적으로 생성하는 정수 시퀀스를 생성합니다. 이 기술을 사용하면 원하는 수의 결과를 단일 행으로 결합할 수 있습니다.

이러한 방법을 사용하면 표 형식의 데이터를 보다 체계적이고 의미 있는 형식으로 효과적으로 그룹화하고 병합하여 데이터 분석 및 시각화를 단순화할 수 있습니다.

위 내용은 SQL에서 여러 열이 있는 여러 행을 동적으로 그룹화하고 병합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿