I’m trying to ‘flatten’ a one to many relationship using SQL to create a CSV of points and their associated photos to use with a web map.
Table 1 is a list of points and their locations, and Table 2 is a list of URLs of photos and their associated captions.
x
Table 1
+-------------+------------+-----------+-------------+
| LOCATION_ID | Name | Latitude | Longitude |
+-------------+------------+-----------+-------------+
| 1 | Dawson | 64.06 | -139.410833 |
| 2 | Whitehorse | 60.716667 | -135.05 |
+-------------+------------+-----------+-------------+
Table 2
+-------------+-------------------------+----------------------+
| LOCATION_ID | CAPTION | URL |
+-------------+-------------------------+----------------------+
| 1 | Photo of Dawson city | http://fakeurl.com/1 |
| 1 | Photo of Klondike River | http://fakeurl.com/2 |
| 1 | Photo of Yukon River | http://fakeurl.com/3 |
| 2 | Photo of Main Street | http://fakeurl.com/4 |
| 2 | Photo of Miles Canyon | http://fakeurl.com/5 |
+-------------+-------------------------+----------------------+
How do I write SQL code so that it creates a table that looks like this?
+-------------+------------+-----------+-------------+----------------------+----------------------+-------------------------+----------------------+----------------------+----------------------+
| LOCATION_ID | NAME | Latitude | Longitude | CAPTION1 | URL1 | CAPTION2 | URL2 | CAPTION3 | URL3 |
+-------------+------------+-----------+-------------+----------------------+----------------------+-------------------------+----------------------+----------------------+----------------------+
| 1 | Dawson | 64.06 | -139.410833 | Photo of Dawson city | http://fakeurl.com/1 | Photo of Klondike River | http://fakeurl.com/2 | Photo of Yukon River | http://fakeurl.com/3 |
| 2 | Whitehorse | 60.716667 | -135.05 | Photo of Main Street | http://fakeurl.com/4 | Photo of Miles Canyon | http://fakeurl.com/5 | | |
+-------------+------------+-----------+-------------+----------------------+----------------------+-------------------------+----------------------+----------------------+----------------------+
Advertisement
Answer
You want to pivot the data in table2
. But to do so, you need a pivoting column, which can be generated using row_number()
.
I prefer to use conditional aggregation for pivoting, so:
select t1.LOCATION_ID, t1.Name, t1.Latitude, t1.Longitude,
max(case when seqnum = 1 then t2.caption end) as caption_1,
max(case when seqnum = 1 then t2.url end) as url_1,
max(case when seqnum = 2 then t2.caption end) as caption_2,
max(case when seqnum = 2 then t2.url end) as url_2,
max(case when seqnum = 3 then t2.caption end) as caption_3,
max(case when seqnum = 3 then t2.url end) as url_3
from table1 t1 left join
(select t2.*,
row_number() over (partition by location_id order by location_id) as seqnum
from table2 t2
) t2
on t1.location_id = t2.location_id
group by t1.LOCATION_ID, t1.Name, t1.Latitude, t1.Longitude;