2010-08-13 11 views
3

내가오라클 10g의 피벗/크로스 탭 쿼리 (동적 열 번호)

UserName  Product  NumberPurchaces 
--------  -------  --------------- 
'John Doe' 'Chair'  4 
'John Doe' 'Table'  1 
'Jane Doe' 'Table'  2 
'Jane Doe' 'Bed'  1 

은 어떻게 오라클 10g에서이 피벗 뷰를 제공하는 쿼리를 만들 수있는이 테이블보기가?

UserName Chair Table Bed 
-------- ----- ----- --- 
John Doe 4  1  0 
Jane Doe 0  2  1 

동적으로 수행하는 방법은 무엇입니까? 나는 많은 접근 방법 (디코딩, PL은/SQL 루프, 노동 조합, 11g 피벗)

을 보았다 그러나 나는


편집 위의 예에 따라 나를 위해 작동 할 무언가를 찾아 아직했습니다 : 사용할 그래서 나는, 그래서 이것은

+0

수 없습니다. 모든 특정 SQL 문은 동일한 수의 열, 열 이름 및 열의 데이터 형식을 사용하여 결과 집합을 반환해야합니다. –

답변

4

오라클 11g는 PIVOT/UNPIVOT을 지원하는 최초의 동적이어야 개발 시간에 제품의 수 또는 유형을 알고하지 않습니다

SELECT t.username, 
     MAX(CASE WHEN t.product = 'Chair' THEN t.numberpurchases ELSE NULL END) AS chair, 
     MAX(CASE WHEN t.product = 'Table' THEN t.numberpurchases ELSE NULL END) AS tbl, 
     MAX(CASE WHEN t.product = 'Bed' THEN t.numberpurchases ELSE NULL END) AS bed 
    FROM TABLE t 
GROUP BY t.username 

DECODE를 사용할 수 있지만 9i 이후 CASE가 지원되었습니다.

+1

감사합니다. 어떻게 이것이 동적이 될 수 있습니까? 예 : 제품이 무엇인지를 미리 알지 못한다. (디자인 타임에 알려지지 않은 동적 목록) –

3

동적으로 쿼리를 작성하려면 코드를 작성해야합니다. 각 MAX() 행은 'CHAIR', 'TABLE'등의 문자열을 제외하고는 동일합니다.

따라서 모든 제품을 찾고 두 번째 쿼리를 작성하기 위해 데이터를 반복해야합니다. 그런 다음 동적으로 작성된 쿼리를 실행하십시오.

+0

* rotfl * 1 년 전 답을 downvoted 했습니까? 당신은 즐거운 하루 보내고 있어야합니다 :) – MatBailie