2009-11-16 3 views
0

3 개 표제에 대해 3 개 표제가 포함되어 있으며 각 표제마다 각기 다른 표식이 어떻게 표시됩니까?3 개 중 최대 2 개 선택

+2

표가 정규화되지 않은 것처럼 들립니다. 'student_id, exam_id, mark '와 같은 테이블을'student_id, mark1, mark2, mark3'처럼 쿼리하는 것이 더 쉽습니다. – dnagirl

답변

4

그것은 끔찍한 것 - 시도 : 당신이 미래에 별도의 행에 각 마크를 저장하는 데 가르 칠 것입니다

select case when mark1 >= mark2 and mark1 >= mark3 then mark1 
      when mark2 >= mark1 and mark2 >= mark3 then mark2 
      else mark3 end as first, 
     case when mark1 >= mark2 and mark1 <= mark3 then mark1 
      when mark1 >= mark3 and mark1 >= mark2 then mark1 
      when mark2 >= mark1 and mark1 >= mark3 then mark2 
      when mark2 >= mark3 and mark1 >= mark1 then mark2 
      else mark3 end as second 
from my_table; 

을 ;-)

+1

+1 for future thoughts =) –

1

첫째, 당신은 정말 테이블을 정상화해야한다. 둘째, 단일 쿼리의 목적으로 정규화하는 쉬운 방법이 있습니다. CTE.

BEGIN; 

CREATE SCHEMA sogrades; 
SET search_path TO sogrades; 

CREATE DOMAIN grade AS 
INT 
CHECK (VALUE BETWEEN 1 AND 5) 
; 

CREATE TABLE grades (
    student INT NOT NULL PRIMARY KEY 
, grade1 GRADE 
, grade2 GRADE 
, grade3 GRADE 
); 

INSERT INTO grades (student, grade1, grade2, grade3) 
VALUES 
    (10, 1, 3, 5) 
, (20, 4, 3, 2) 
, (30, 1, 2, 1) 
; 

WITH g (student, grade) AS (
    SELECT student, grade1 FROM grades UNION 
    SELECT student, grade2 FROM grades UNION 
    SELECT student, grade3 FROM grades 
) 
SELECT DISTINCT gl.student, gl.grade 
FROM g gl, g gr 
WHERE gl.student = gr.student 
    AND gl.grade < gr.grade 
ORDER BY student, grade; 

ROLLBACK;