Как запрашивать данные из двух таблиц и группировать по двум столбцам - PullRequest
0 голосов
/ 14 июля 2020

Я использую SQL Server , и у меня есть две огромные таблицы, содержащие всевозможные данные. Я хотел бы получить данные о том, сколько латышей или русских проживает в каждом городе.

Столбец «Язык» содержит более двух языков, но я хотел бы запросить только «латышский» и «русский»

Table1 (заслуживающие упоминания столбцы):

ID
ProjectID
Phone_nr
City

Table2 (заслуживающие упоминания столбцы):

ID
ProjectID
Phone_nr
Language

Я хочу, чтобы запрос извлекал информацию примерно так:

City1(RU) | Amount of Russians
City1(LT) | Amount of Latvians
City2(RU) | Amount of Russians
City2(LT) | Amount of Latvians
.. etc

Или что-то вроде этого:

City1 | Amount of Russians | Amount of Latvians  | Total amount of people
City2 | Amount of Russians | Amount of Latvians  | Total amount of people
City3 | Amount of Russians | Amount of Latvians  | Total amount of people
.. etc

Интересно, какое решение для этого будет лучшим? Должен ли я использовать join или union или простой select?

Я придумал такой запрос:

SELECT DISTINCT top 100 t.city, count(t.city) as 'Total amount of nr in city', count(*), l.language
FROM table1 l, table2 t
WHERE l.phone = t.phone and l.projectID = t.projektID
group by t.city, l.language

Я считаю, что предложение where правильное поскольку в обеих таблицах есть номера телефонов и идентификаторы проектов, важно, чтобы запрос выбирал с этим предложением where. К сожалению, это не совсем работает. Он возвращает строки в следующем формате:

City1 | Amount of y | total amount of numbers in this language
City1 | Amount of x | total amount of numbers in that language

Это близко, но этого недостаточно. Примечание: я использую select top 100 только для тестирования, я выберу все, как только у меня будет правильный запрос.

Может ли кто-нибудь помочь или указать мне правильное направление? Спасибо

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете попробовать использовать условное агрегирование -

SELECT t.city, 
count(case when l.language='Russians' then 1 end) as 'Amount of Russians',
count(case when l.language='Latvians' then 1 end) as 'Amount of Latvians',
count(*) as 'Total amount of nr in city'
FROM table1 l inner join table2 t
on l.phone = t.phone and l.projectID = t.projektID
group by t.city

Примечание: всегда лучше использовать явное объединение.

1 голос
/ 14 июля 2020

Логи c @Fahmi верны. Есть еще один способ использования SUM вместо COUNT. Я добавляю то же самое, чтобы рассмотреть дополнительные возможности.

SELECT t.city, 
SUM(case when l.language='Russians' then 1 else 0 end) as 'Amount of Russians',
SUM(case when l.language='Latvians' then 1  else 0 end) as 'Amount of Latvians',
count(*) as 'Total amount of nr in city'
FROM table1 l inner join table2 t
on l.phone = t.phone and l.projectID = t.projektID
group by t.city
...