2014-01-23 3 views
0

저는 Oracle 11g 데이터베이스로 작업하고 있습니다. 여러 표를 함께 결합해야하며 그 중 하나의 표에는 각 결과가 한 행인 여러 테스트의 결과 값이 들어 있습니다. 테이블을 결합 할 때 여러 테스트 결과를 하나의 행으로 집계합니다.테이블을 조인하고 행을 열로 바꾸십시오.

다음은 내가 가진 것의 축소 된 예입니다. 요청, 테스트 및 특정 테스트에 대한 결과라는 세 테이블의 데이터를 쿼리하고 있습니다.

SELECT 
    requisitions.acc_id 
    ,tests.test_name 
    ,results.result_numeric 
FROM requisitions 

inner join req_panels ON requisitions.acc_id = req_panels.acc_id 
inner join results ON req_panels.rp_id = results.rp_id 
inner join tests ON results.test_id = tests.test_id 

WHERE results.test_id IN (1,2,7,8) 
ORDER BY requisitions.acc_id 

결과는 다음과 같습니다.

Acc_ID | Test_Name | Result_Numeric 
------------------------------------ 
000001 | Test 1 | 24 
000001 | Test 2 | 1.5 
000002 | Test 1 | 15 
000002 | Test 2 | 2.1 

하지만 내가 얻고 싶은 것은;

Acc_ID | Test 1 | Test 2 
-------------------------- 
000001 | 24 | 1.5 
000002 | 15 | 2.1 

바라기를. 피벗이나 다른 것을 사용해야합니까? 나는 아직도 비교적 새로운 피봇 팅 (pivoting)에 익숙하며 아직 사용 방법을 이해하지 못했습니다.

감사합니다.

편집 : 이것은 피벗을 사용하여 만들었습니다. 피봇을 처음 사용하려고 시도했기 때문에 내가 잘못한 일이나 더 효율적으로 수행 할 수있는 일만하면 알려주는 것입니다.

SELECT * FROM (
    SELECT requisitions.acc_id 
    ,tests.TEST_ID 
    ,results.RESULT_NUMERIC 
FROM requisitions 

inner join req_panels ON requisitions.acc_id = req_panels.acc_id 
inner join results ON req_panels.rp_id = results.rp_id 
inner join tests ON results.test_id = tests.test_id 

WHERE results.TEST_ID IN (1,2,3) 
) 
pivot(
     MAX(RESULT_NUMERIC) 
     for TEST_ID IN ('1' AS Test 1,'2' AS Test 2,'3' AS Test 3) 
) 
ORDER BY ACC_ID 

답변

2

당신은 CASE 표현식으로 집계 함수를 사용하여 최종 결과를 얻을 수 있어야합니다 :

SELECT r.acc_id, 
    max(case when t.test_name = 'Test 1' then rs.result_numeric end) Test1, 
    max(case when t.test_name = 'Test 2' then rs.result_numeric end) Test2 
FROM requisitions r 
inner join req_panels rp 
    ON r.acc_id = rp.acc_id 
inner join results rs 
    ON rp.rp_id = rs.rp_id 
inner join tests t 
    ON rs.test_id = t.test_id 
WHERE rs.test_id IN (1,2,7,8) 
GROUP BY r.acc_id 
ORDER BY r.acc_id; 

또는 당신이 PIVOT 구문을 사용할 수 있습니다

select acc_id, Test1, Test2 
from 
(
    select r.acc_id, t.test_name, rs.result_numeric 
    FROM requisitions r 
    inner join req_panels rp 
    ON r.acc_id = rp.acc_id 
    inner join results rs 
    ON rp.rp_id = rs.rp_id 
    inner join tests t 
    ON rs.test_id = t.test_id 
    WHERE rs.test_id IN (1,2,7,8) 
) d 
pivot 
(
    max(result_numeric) 
    for test_name in ('Test 1' as Test1, 'Test 2' as Test2) 
) piv; 
+0

감사합니다,이 많은 도움이되었습니다. 나는 실제로 당신이 대답하기 전에 마지막으로 일한 분과 가까운 뭔가를 생각해 내었습니다. 실제 차이점은 피벗에서 test_name 대신 test_id를 사용한다는 것입니다. 나는 조정해야 할 지 모르지만 나는 여전히 다른 몇 가지 엣지 경우를 연구 중이다. – JayG30

관련 문제