CREATE TABLE STUDENTS (SID VARCHAR(11)) ;
INSERT INTO STUDENTS VALUES ('ADAM') ;INSERT INTO STUDENTS VALUES ('BRIAN') ;
INSERT INTO STUDENTS VALUES ('CHARLES') ;
INSERT INTO STUDENTS VALUES ('DAVE') ;
SELECT * FROM STUDENTS;
SID
|
DAVE
|
CHARLES
|
BRIAN
|
ADAM
|
CREATE TABLE MARKS (SID VARCHAR(11), SUBJECT VARCHAR(11), MARK INT2) ;
INSERT INTO MARKS VALUES ('ADAM', 'ENGLISH', 20) ;INSERT INTO MARKS VALUES ('ADAM', 'HISTORY', 40) ;
INSERT INTO MARKS VALUES ('ADAM', 'SCIENCE', 60) ;
INSERT INTO MARKS VALUES ('BRIAN', 'HISTORY', 60) ;
INSERT INTO MARKS VALUES ('BRIAN', 'SCIENCE', 80) ;
INSERT INTO MARKS VALUES ('CHARLES', 'ENGLISH', 60) ;
INSERT INTO MARKS VALUES ('CHARLES', 'SCIENCE', 20) ;
INSERT INTO MARKS VALUES ('DAVE', 'ENGLISH', 80) ;
INSERT INTO MARKS VALUES ('DAVE', 'HISTORY', 20) ;
INSERT INTO MARKS VALUES ('DAVE', 'SCIENCE', 40) ;
SELECT * FROM MARKS;
SID
|
SUBJECT
|
MARK
|
ADAM
|
ENGLISH
|
20
|
ADAM
|
HISTORY
|
40
|
ADAM
|
SCIENCE
|
60
|
BRIAN
|
HISTORY
|
60
|
BRIAN
|
SCIENCE
|
80
|
CHARLES
|
ENGLISH
|
60
|
CHARLES
|
SCIENCE
|
20
|
DAVE
|
ENGLISH
|
80
|
DAVE
|
HISTORY
|
20
|
DAVE
|
SCIENCE
|
40
|
SELECT S.SID, E.MARK AS ENGLISH, H.MARK AS HISTORY, C.MARK AS SCIENCE
FROM STUDENTS AS SLEFT OUTER JOIN MARKS AS E ON (S.SID = E.SID AND E.SUBJECT = 'ENGLISH')
LEFT OUTER JOIN MARKS AS H ON (S.SID = H.SID AND H.SUBJECT = 'HISTORY')
LEFT OUTER JOIN MARKS AS C ON (S.SID = C.SID AND C.SUBJECT = 'SCIENCE')
ORDER BY 1 ;
SID
|
ENGLISH
|
HISTORY
|
SCIENCE
|
ADAM
|
20
|
40
|
60
|
BRIAN
|
NULL
|
60
|
80
|
CHARLES
|
60
|
NULL
|
20
|
DAVE
|
80
|
20
|
40
|
Actually, this sample above is the excerpt from Netezza
support. However,the most efficient way is use the query below with two advantages:
1. Only one table is used2. Not any joins are needed
3. The performance is much better than approach above
SELECT
SID,MAX(CASE WHEN SUBJECT = 'ENGLISH' THEN MARK ELSE NULL END) AS ENGLISH
,MAX(CASE WHEN SUBJECT = 'HISTORY' THEN MARK ELSE NULL END) AS HISTORY
,MAX(CASE WHEN SUBJECT = 'SCIENCE' THEN MARK ELSE NULL END) AS SCIENCE
FROM MARKS
GROUP BY SID
ORDER BY 1 ;
SID
|
ENGLISH
|
HISTORY
|
SCIENCE
|
ADAM
|
20
|
40
|
60
|
BRIAN
|
NULL
|
60
|
80
|
CHARLES
|
60
|
NULL
|
20
|
DAVE
|
80
|
20
|
40
|
No comments:
Post a Comment