CAMPAIGN table
| ID | campaign_name |
|---|---|
| 1 | Campaign A |
| 2 | Campaign B |
PARTICIPANT table
| ID | campaign_id | participant_name |
|---|---|---|
| 1 | 1 | Alice |
| 2 | 1 | Ben |
CUSTOM_FIELD table
| ID | campaign_id | field_name |
|---|---|---|
| 1 | 1 | Gender |
| 2 | 1 | Age |
FIELD_ANSWER table
| ID | participant_id | field_id | answer |
|---|---|---|---|
| 1 | 1 | 1 | Female |
| 2 | 1 | 2 | 24 |
| 3 | 2 | 1 | Male |
| 4 | 2 | 2 | 28 |
With these tables in above, can we query a result as shown below?
| Campaign Name | Participant Name | Gender | Age |
|---|---|---|---|
| Campaign A | Alice | Female | 24 |
| Campaign A | Ben | Male | 28 |
Advertisement
Answer
Using pivoting logic we can try:
SELECT
c.campaign_name,
p.participant_name,
MAX(CASE WHEN cf.field_name = 'Gender' THEN fa.answer END) AS Gender,
MAX(CASE WHEN cf.field_name = 'Age' THEN fa.answer END) AS Age
FROM CAMPAIGN c
INNER JOIN PARTICIPANT p
ON p.campaign_id = c.ID
INNER JOIN FIELD_ANSWER fa
ON fa.participant_id = p.ID
INNER JOIN CUSTOM_FIELD cf
ON cf.ID = fa.field_id AND cf.campaign_id = c.ID
GROUP BY
c.campaign_name,
p.participant_name;
Here is a demo in SQL Server, though the above query should run on most other database as well.
