> 데이터 베이스 > MySQL 튜토리얼 > 그룹화 열을 기반으로 동적으로 생성된 열을 사용하여 여러 SQL 행을 하나로 병합하는 방법은 무엇입니까?

그룹화 열을 기반으로 동적으로 생성된 열을 사용하여 여러 SQL 행을 하나로 병합하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-22 01:22:09
원래의
351명이 탐색했습니다.

How to Merge Multiple SQL Rows into One with Dynamically Generated Columns Based on a Grouping Column?

열 그룹화를 기반으로 동적으로 열을 생성하고 SQL 데이터의 여러 행을 병합합니다

질문:

특정 열을 기준으로 데이터를 그룹화하고 동일한 열 값을 가진 여러 행을 단일 행으로 병합하여 동시에 여러 열을 생성하는 방법은 무엇입니까? 특히 "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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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