고유 레코드에 대한 동적 PIVOT 쿼리
문제:
다음 표를 고려하세요.
| Id | Code | percentage | name | name1 | activity | |---|---|---|---|---|---| | 1 | Prashant | 43.43 | James | James_ | Running | | 1 | Prashant | 70.43 | Sam | Sam_ | Cooking | | 1 | Prashant | 90.34 | Lisa | Lisa_ | Walking | | 1 | Prashant | 0.00 | James | James_ | Stealing | | 1 | Prashant | 0.00 | James | James_ | Lacking | | 1 | Prashant | 73 | Sam | Sam_ | Cooking 1 |
사용 표준 PIVOT 쿼리의 경우 0.00%의 고유한 레코드를 유지하는 것이 어려울 수 있습니다. MAX 함수는 종종 이러한 행을 무시하여 불완전한 결과를 초래합니다.
예상 결과:
| 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 쿼리에 ROW_NUMBER() 함수를 도입할 수 있습니다. 이 기능은 각 이름 그룹 내의 레코드에 행 번호를 할당하여 0.00%의 레코드도 유지되도록 합니다.
;with cte as ( select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM from table_name ), 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 및 name1 값을 런타임 시 채울 수 있는 동적 변수로 바꿀 수 있습니다. 이를 통해 쿼리는 다양한 수의 열이 포함된 테이블을 처리할 수 있습니다.
위 내용은 테이블을 동적으로 PIVOT하고 백분율이 0인 고유한 레코드를 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!