2014-02-21 4 views
0

변형 된 열을 행에 unpivot하지 않았습니다. http://sqlfiddle.com/#!4/fc489/6SQL : oracle 11g, 결과 집합을 2 개의 하위 집합으로 분할하여 나란히 표시

지금은

AVGGPA  1     1 
COURSEAVG 101.5    101.5 
STUDENTNAME Jilly Doe   John Doe 

어떤 힌트 같은 측면 무언가에 의해 학생 정보면에 표시 할 것 ??

+0

왜 두 개의 하위 집합 - 왜 두 명 이상의 학생이 있습니까? –

+0

각 학생은 별도의 칼럼이 될 것입니다. 그래서 3 명의 학생이 3 개의 칼럼과 1 개의 학생 데이타를 보유하고 3 개의 칼럼은 한 개의 학생 데이타를 보유하고 있습니다. –

+0

Pivot은 여기에서 작동하지만 왜 SQL을 사용하지 않으려 고 노력합니까? SQL로 데이터를 검색하고 응용 프로그램 형식을 지정하고 시각화하십시오. 당신이 정말로 plaintext SQLPlus 결과를 원한다면 ... –

답변

1

당신이 정말로 단지 당신이 지금까지 무엇을 구축하는 간단한 방법에 대해 고민하는 두 부분 집합이있는 경우는 다음과 같습니다

SELECT labeln, 
    MAX(CASE WHEN rn = 1 THEN value1 END) AS col1, 
    MAX(CASE WHEN rn = 2 THEN value1 END) AS col2 
FROM (
    SELECT * FROM (
    SELECT to_char(avg(g1.grade)) AS avgGPa, 
     to_char(avg(s1.course)) AS courseAVG, 
     s1.student_name AS studentName, 
     ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY s1.student_name) AS RN 
    FROM student s1 
    JOIN grade g1 ON s1.student_name = g1.student_name 
    GROUP BY s1.student_name 
) 
    UNPIVOT (value1 FOR labeln IN (avggpa, courseavg, studentname)) 
) 
GROUP BY labeln 
ORDER BY labeln; 

SQL Fiddle

그것은 기본적으로 수동 피벗이다; row_number()을 원래 쿼리에 추가 한 다음이를 사용하여 해당 값이 들어갈 열을 결정하고 max()을 입력하여 공백을 축소합니다. max(case(...)) 비트를 복제하고 rn 수표 만 변경하여 더 많은 열을 쉽게 추가 할 수 있습니다. 그러나 결국 몇 개의 컬럼을 사용해야 하는지를 알아야합니다. 또는 과대 평가하고 끝에 공백이 있어야합니다.

이론상 실제 pivot()을 사용할 수 있지만 미리 값을 알지 못하므로 for 절에 사용할 값이 없습니다. 아마도 XML 접근법을 사용할 수는 있지만 과장 될 수 있습니다. 이것이 실제 사용법에 따라 달라질 수 있습니다.

+0

굉장한 작품 매력적인 방법 ... 어떻게 당신의 대답을 받아 들일 수 있습니까? –

관련 문제