>데이터 베이스 >MySQL 튜토리얼 >SQL Server의 테스트 유형에 따라 여러 행을 하나의 행으로 동적으로 병합하는 방법은 무엇입니까?

SQL Server의 테스트 유형에 따라 여러 행을 하나의 행으로 동적으로 병합하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-22 01:08:37781검색

How to Dynamically Merge Multiple Rows into One Row Based on Test Type in SQL Server?

테스트 유형에 따라 여러 행을 하나의 행으로 동적으로 병합(SQL Server)

질문:

Result, WorkOrderTestType 열이 있는 Result이라는 테이블이 있습니다. TestType 열을 기준으로 그룹화하고 동일한 TestType이 포함된 여러 행을 하나의 행으로 병합하려고 합니다. 그러나 각 TestType에 대해 얼마나 많은 Result 열이 있는지 알 수 없습니다.

해결책:

이 문제를 해결하기 위해 동적 SQL을 사용할 수 있습니다. 다음 쿼리는 최대 100개의 결과에 대해 작동합니다. 결과가 100개가 넘는 경우 CTE Tally의 N에 CROSS JOIN를 더 추가할 수 있습니다.

<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) --100 行,更多行需要添加更多 N
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 Server의 테스트 유형에 따라 여러 행을 하나의 행으로 동적으로 병합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.