Суть сводных таблиц в базах данных в этом? Во времена Access эти внешние и первичные ключи было сложно понять...
Мозг был ими прокомпостирован изрядно... Хоть тут, в sqlite, правильное понимание пришло? Оказалось что вроде не так всё и сложно...
import sqlite3 as sql
cities_ = [
('Кострома',),
('Москва',),
('Томск',)
]
persons_ = [
('2', 'Иван', 'Петров'),
('1', 'Олег', 'Николаев'),
('3', 'Василий', 'Васильев'),
('2', 'Алена', 'Непомнящая'),
('2', 'Николай', 'Серов'),
('1', 'Юлия', 'Петрова'),
]
with sql.connect("test6.db") as con:
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS cities")
cur.execute("DROP TABLE IF EXISTS persons")
cur.execute("""CREATE TABLE IF NOT EXISTS cities (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sty_name TEXT
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS persons (
user_id INTEGER,
name TEXT,
surname TEXT
)""")
cur.executemany("INSERT INTO cities VALUES (NULL, ?)", cities_)
cur.executemany("INSERT INTO persons VALUES(?,?,?)", persons_)
cur.execute("""SELECT sty_name, name, surname
FROM cities JOIN persons ON
cities.id=persons.user_id ORDER BY sty_name""")
result = cur.fetchall()
for i in result:
print(*i)
Кострома Олег Николаев
Кострома Юлия Петрова
Москва Иван Петров
Москва Алена Непомнящая
Москва Николай Серов
Томск Василий Васильев

Сводная таблица - это вообще не из области баз данных и акцесса, а скорее, из экселя. В теории БД вместо сводных таблиц используется многомерный анализ, в практических реализациях - это OLAP и гиперкубы вместо таблиц в SQL Server, например, ну или просто временные таблицы/представления для простых случаев.
То, что в примере - это даже не сводная таблица, а просто связь между двумя таблицами в БД. "Сводную таблицу" (как вывод результата запроса) можно сделать например, на такой модели: есть таблица городов, таблица менеджеров в каждом городе (по нескольку штук) и есть таблица продаж, где написано, какой менеджер сколько чего продал. Вот если требуется аггрегирование общей суммы продаж по городам - то такой запрос и его результат в виде, скажем, временной таблицы или представления уже можно назвать "сводной таблицей", где данные берутся из разных таблиц.
Ну и во второй таблице, если user_id означает город, то логичнее его было бы назвать cities_id.