Transposing/Wrangling Database Table Firstly, transposing is too specific a word for the kind of transform I want to do. I have a software that allows a technician to design custom forms for end users. From the form, I can see every entry on it (checkbox, textbox) is stored in a row. I have been asked to report on these forms, and the only way I can think of to make the data more usable is to wrangle it into a new table where each row represents one form entry. 

Before:

Entry    FormElement    Value
1        Checkbox1      True
1        Textbox1       Joe Smith
2        Checkbox1      False
2        Textbox1       Jane Johnson


After:

Entry    Name          isMale
1        Joe Smith     True
2        Jane Johnson  False



Is there any other way to report on the data than what I am considering? 
Should I use a stored procedure?
The only way I see with such a design is to self join the table several times. This means a JOIN for each column required in the output.

Notes:


The sample used is available toward the end and in this SQL Fiddle. 
You will have to figure out what the value of FormElement means when writing the query
An age value has been added to it (bigger sample).
Expect bad performances with such a design on a large data set
An index on FormElement and Entry including Value or filtered indexes on FormElement may help. 
It uses 1 subquery for each object because it helps see the separation between self joins.
I suppose there is always a row for each object from the form (hence the INNER JOIN)
I replace isMale by a CASE statement and Male or Female. It may help you.
Views may help writing shorter queries if some combination are often used.


People between 30 and 40

For example, if you want people between 30 and 40:

SELECT name.Entry
    , Name = name.[Value]
    , Sex = CASE WHEN sex.[Value] = 'True' THEN 'Male' ELSE 'Female' END 
    , Age = age.[Value]
FROM (
    SELECT [Entry], [Value] FROM data WHERE [FormElement] = 'Textbox1'
) name
INNER JOIN (
    SELECT [Entry], [Value] FROM data WHERE [FormElement] = 'Checkbox1'
) sex 
    ON name.Entry = sex.Entry
INNER JOIN (
    SELECT [Entry], [Value] FROM data WHERE [FormElement] = 'Textbox2'
) age
    ON name.Entry = age.Entry
WHERE age.[Value] &gt; 30 AND age.[Value] &lt; 40
;


Output:

Entry   Name        Sex     Age
1       Joe Smith   Male    32
3       Lucy Smith  Female  35


Name starting with a J

For people with a name with a J:

SELECT name.Entry
    , Name = name.[Value]
    , Sex = CASE WHEN sex.[Value] = 'True' THEN 'Male' ELSE 'Female' END 
    , Age = age.[Value]
FROM (
    SELECT [Entry], [Value] FROM data WHERE [FormElement] = 'Textbox1'
) name
INNER JOIN (
    SELECT [Entry], [Value] FROM data WHERE [FormElement] = 'Checkbox1'
) sex 
    ON name.Entry = sex.Entry
INNER JOIN (
    SELECT [Entry], [Value] FROM data WHERE [FormElement] = 'Textbox2'
) age
    ON name.Entry = age.Entry
WHERE name.[Value] LIKE 'j%'
;


Output:

Entry   Name            Sex     Age
1       Joe Smith       Male    32
2       Jane Johnson    Female  25


Sample data used

CREATE TABLE data
    ([Entry] int, [FormElement] varchar(9), [Value] varchar(12))
;

INSERT INTO data
    ([Entry], [FormElement], [Value])
VALUES
    (1, 'Checkbox1', 'True'),
    (1, 'Textbox1', 'Joe Smith'),
    (1, 'Textbox2', '32'),
    (2, 'Checkbox1', 'False'),
    (2, 'Textbox1', 'Jane Johnson'),
    (2, 'Textbox2', '25'),
    (3, 'Checkbox1', 'False'),
    (3, 'Textbox1', 'Lucy Smith'),
    (3, 'Textbox2', '35')
;