What you’re trying to do, displaying several items from different rows as several columns in a single row, is called a “pivot”. The basic technique is to use CASE (or something else with if-then-else logic) to pick the value for just one field, and use GROUP BY to combine all the fields for a record, as shown below.
I assume you have a column (I’ll call it record_id) that tells which record each row belongs in. That is, the rows with unique_ids 1 and 2 will have the same record_id if the name on row 1 goes with the city on row 2. (If you don’t have such a column, how do you know that John is from Washington? He could be from San Diego, or his city could be missing.) This solution assumes the combination of record_id and field_id is unique: there doesn’t have to be a field_id=631 for record_id=101, but there can’t be more than one (or else some data will not be displayed).
, MIN (CASE field_id WHEN 631 THEN field_value END) AS name
, MIN (CASE field_id WHEN 632 THEN field_value END) AS city
, MIN (CASE field_id WHEN 633 THEN field_value END) AS e_mail
GROUP BY record_id
ORDER BY record_id;
In addition to this technique you can also use the PIVOT command is you are using SQL Server 2005 or above.
SELECT form_id,  as [name],  as [city],  as [e_mail]
FROM (SELECT form_id, field_id, field_value
FROM table) as SourceTable
FOR field_id IN (, , )
) as PivotTable;