I have a table similar to the following -
| id | name | subject | score | 
|---|---|---|---|
| 1 | XYZ | English | 50 | 
| 1 | XYZ | Math | 30 | 
Now I need to something as follows-
| id | name | English | Math | 
|---|---|---|---|
| 1 | XYZ | 50 | 30 | 
I tried UNION and JOIN but nothing worked.
I have a table similar to the following -
| id | name | subject | score | 
|---|---|---|---|
| 1 | XYZ | English | 50 | 
| 1 | XYZ | Math | 30 | 
Now I need to something as follows-
| id | name | English | Math | 
|---|---|---|---|
| 1 | XYZ | 50 | 30 | 
I tried UNION and JOIN but nothing worked.
 
    
     
    
    After I fixed the example in the question to make sense, this would produce your desired result:
SELECT *
FROM   crosstab(
   'SELECT id, name, subject, score
    FROM   tbl
    ORDER  BY 1,3'  -- just "ORDER BY 1" works, too
  , $$VALUES ('Math'::text), ('English')$$
   ) AS ct (id int, name text, "Math" int, "English" int);
Detailed explanation:
In particular, to add "extra" columns (name in this example):
