2017-01-27 1 views
1

새내기, 여기이 질문이 너무 바보가 아니길 바랍니다. SQL 데이터베이스에 실험실 샘플 표가 있습니다. 여기에는 Sample_IDs, Test_Names, Subtest_Names 및 Results가 포함됩니다.SQL 하위 범주를 다루는 방법

SELECT Sample, Test, Subtest, Result 
    FROM table 
WHERE Sample = 'list of sample #s' 

을 그리고 이것은 다음과 같은 결과를 제공합니다 : 나의 현재 간단한 SQL 쿼리는 다음과 같이

SAMPLE TEST SUBTEST RESULT 
XX01 Test1 Test1Sub1 1 
XX02 Test1 Test1Sub1 2 
XX03 Test1 Test1Sub1 3 
XX03 Test2 Test2Sub1 4 
XX03 Test3 Test3Sub1 5 
XX03 Test3 Test3Sub2 6 
XX03 Test3 Test3Sub3 7 
XX03 Test4 Test4Sub1 8 
XX03 Test4 Test4Sub2 9 
XX03 Test4 Test4Sub3 10 

을 그러나, 나는 독특한 Sample_ID으로 나열하고 열로 하위 검사를 나열하는 테이블을 찾고 있어요. 내가 찾고있는 Subtest의 이름을 알고 쿼리에서 지정할 수 있습니다. 예를 들어 위의 결과를 대신 다음과 같이 표시하고 싶습니다.

Test1Sub1 Test2Sub1 Test3Sub1 Test3Sub2 Test3Sub3 Test4Sub1 Test4Sub2 Test4Sub3 
XX01 1       
XX02 2       
XX03 3   4   5   6   7   8   9   10 

누군가 SQL 코드를 도와 줄 수 있습니까? 나는 약간의 수색을 했지 만 아직 내가 찾던 답을 찾기에 충분할 정도로 구체적이지는 못했다. 감사! 내가 추측하고있어 - 여기

+0

은 하위 검사 수 (이 예에서는 8)가 고정 되었습니까? –

+0

@ koenig26은 (는) 사용자 환경의 SQL Server입니까? –

+0

@zaggler MySQL 태그를 제거하는 것이 올바른지 잘 모르겠습니다. OP가 해당 데이터베이스에 태그를 지정했습니다. – Taryn

답변

0
CREATE TABLE #Test 
(SAMPLE VARCHAR(100), TEST VARCHAR(100), SUBTEST VARCHAR(100), RESULT INT) 
INSERT INTO #TEST 
VALUES 
('XX01','Test1','Test1Sub1', 1 ), 
('XX02','Test1','Test1Sub1', 2 ), 
('XX03','Test1','Test1Sub1', 3 ), 
('XX03','Test2','Test2Sub1', 4 ), 
('XX03','Test3','Test3Sub1', 5 ), 
('XX03','Test3','Test3Sub2', 6 ), 
('XX03','Test3','Test3Sub3', 7 ), 
('XX03','Test4','Test4Sub1', 8 ), 
('XX03','Test4','Test4Sub2', 9 ), 
('XX03','Test4','Test4Sub3', 10) 


SELECT * 
FROM 
(
    SELECT SAMPLE,RESULT,SUBTEST 
      FROM #Test   
) as s 
PIVOT 
(
    MAX(RESULT) 
    FOR SUBTEST IN 
(
Test1Sub1, 
Test2Sub1, 
Test3Sub1, 
Test3Sub2, 
Test3Sub3, 
Test4Sub1, 
Test4Sub2, 
Test4Sub3 
) 
)AS pvt 

enter image description here

+2

MySQL에는 피벗 기능이 없습니다 –

+1

@ P.Salmon 그는 SQL 데이터베이스를 그렇게 생각했습니다. 죄송합니다 –

+1

@ P.Salmon 왜냐하면 그는 단지 MySQL에 태그를 달았 기 때문에 *** 아닙니다 *** 사용하고 있음을 의미합니다. ************************************************************************************************** 슬픈 당신이 틀렸다는 것을 말하기 ... 해결책을위한 +1 ... – Codexer

0

는 왼쪽

select base.sample, 
     sum(t1s1.result) as Test1Sub1, 
     sum(t2s1.result) as Test2Sub1, 
     sum(t3s1.result) as Test3Sub1, 
     sum(t4s1.result) as Test4Sub1, 
     sum(t4s2.result) as Test4Sub2, 
     sum(t4s3.result) as Test4Sub3 
from (select distinct sample from tablename) as base 
left join tablename t1s1 on base.sample = t1s1.sample and t1s1.subtest='Test1Sub1' 
left join tablename t2s1 on base.sample = t2s1.sample and t2s1.subtest='Test2Sub1' 
left join tablename t3s1 on base.sample = t3s1.sample and t3s1.subtest='Test3Sub1' 
left join tablename t4s1 on base.sample = t4s1.sample and t4s1.subtest='Test4Sub1' 
left join tablename t4s2 on base.sample = t4s2.sample and t4s2.subtest='Test4Sub2' 
left join tablename t4s3 on base.sample = t4s3.sample and t4s3.subtest='Test4Sub3' 
group by sample 
대신 SUM()의) 최대 (사용할 수 있습니다

대신 피벗 조인 방법으로 할 수 있습니다 당신은 실제로 합을 원합니다.

관련 문제