>데이터 베이스 >MySQL 튜토리얼 >고유한 레코드를 보존하는 동적 PIVOT 쿼리를 만드는 방법은 무엇입니까?

고유한 레코드를 보존하는 동적 PIVOT 쿼리를 만드는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-24 02:15:10287검색

How to Create a Dynamic PIVOT Query that Preserves Distinct Records?

고유 레코드를 보존하기 위한 동적 PIVOT 쿼리

문제:

PIVOT 쿼리는 종종 MAX를 사용합니다. () 데이터를 요약하기 위한 집계로 인해 고유한 데이터가 손실될 수 있습니다. 가치. 예를 들어, 동일한 이름에 대한 여러 활동 레코드가 있는 테이블에서 PIVOT은 MAX() 값이 더 낮은 레코드를 무시할 수 있습니다.

목표:

동적 PIVOT 만들기 고유한 레코드와 해당 비율을 유지하는 쿼리 값.

해결책:

  1. ROW_NUMBER() 분할 도입: 다음을 수행하기 전에 이름 열을 기준으로 분할하여 ROW_NUMBER()를 추가합니다. 피벗. 이는 백분율 순서를 유지하면서 고유한 이름 행에 고유한 행 번호를 할당합니다.
  2. 분할된 데이터의 피벗: PIVOT 쿼리에서 ROW_NUMBER()를 추가 열로 사용합니다. 출력은 고유한 이름 행과 해당 활동 및 비율을 일치시킵니다.
  3. 동적 집계를 위한 재그룹화: 피버팅 후 ID, 코드 및 ROW_NUMBER()를 기준으로 데이터를 그룹화합니다. 이 단계에서는 각 고유 이름 행의 백분율 값을 결합합니다.
;with cte as
(
    select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM
    from A
),
cte2 as
(
    SELECT Id,Code,ROWNUM,James,James_,Sam,Sam_,Lisa,Lisa_
    FROM cte
    PIVOT(MAX(activity)
          FOR name IN (James,Sam,Lisa)) AS PVTTable PIVOT
          (
          MAX(percentage)
          FOR name1 IN (James_,Sam_,Lisa_)) AS PVTTable1
)
select Id, Code, MAX(James) James, MAX(James_) James_, MAX(Sam) Sam, MAX(Sam_) Sam_, MAX(Lisa) Lisa, MAX(Lisa_) Lisa_
from cte2
group by Id, Code, ROWNUM

동적 쿼리 생성:

동적 쿼리 생성의 경우 쉼표로 구분된 목록을 바꿉니다. 이름(@name_concat, @name1_concat) 및 SELECT MAX() 집계(@select_aggs)와 다음을 수행할 수 있는 변수 런타임 시 채워집니다.

예제 결과:

쿼리는 고유한 이름 행과 해당 비율을 유지하면서 원하는 출력을 반환합니다.

Id  Code        James       James_  Sam         Sam_    Lisa    Lisa_
1   Prashant    Running     43.43   Cooking 1   73      Walking 90.34
1   Prashant    Stealing    0.00    Cooking     3.43    NULL    NULL
1   Prashant    Lacking     0.00    NULL        NULL    NULL    NULL

위 내용은 고유한 레코드를 보존하는 동적 PIVOT 쿼리를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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