Среднее SQL между 2 таблицами
Я получил две таблицы, которые связаны между собой Computer_ID
,
Первый Computer_ID
, Country
который содержит компьютеры и страну их происхождения, а вторая таблица содержит информацию о процессоре: Computer_ID
, CPU_Manufacture
Я хочу получить для каждой страны среднее количество процессоров для компьютера
Я ожидаю такой результат:
Country |Avg CPUs
United-States|2.5
Canada |3.2
Пример данных из Computers
Таблица:
Computer_ID|Country
1 |United-States
2 |United-States
3 |United-States
4 |United-States
5 |United-States
6 |Canada
7 |Canada
Пример данных из CPU
таблица:обратите внимание, что каждый компьютер может иметь несколько процессоров
Computer_ID|CPU_Manufacture
1 |Intel
1 |Intel
2 |Intel
2 |AMD
2 |AMD
3 |AMD
4 |AMD
4 |Intel
Любая помощь будет хорошей. Спасибо
4 ответа
INNER JOIN
ваши две таблицы и использовать AVG
функция.
SELECT com.Country, AVG(cpu.cores) AS "Avg Cores"
FROM computers com
INNER JOIN cpu on com.Computer_ID = cpu.Computer_ID
Мой первый вопрос: почему у вас есть эти две таблицы, когда вы можете иметь эту информацию только в одной? Из того, что я собираю, вы хотите запрос, подобный этому:
select Country, Avg(Cores)
from computes as t1 left join cpu as t2
on (t1.computer_id = t2.computer_id)
where t2.CPU_Manufacture = 'Intel'
group by Country;
Попробуйте этот запрос:
SELECT DISTINCT
t.country,
t.country_cpu_count / t.country_comp_count AS avg_cpus
FROM
(
SELECT
comp.country,
count(distinct cpu.computer_id) over(partition by comp.country) AS country_comp_count
count(cpu.cpu_manufacture) over(partition by comp.country) AS country_cpu_count,
FROM
computers comp
LEFT JOIN
cpu cpu ON (cpu.computer_id = comp.computer_id)
) t
Надеюсь, это поможет.
Вы можете достичь этого с помощью этого решения:
;WITH cte AS (
SELECT Country,[Computers]=COUNT(*) FROM Computers com
GROUP BY Country
),
cte2 AS (
SELECT Country,Cores=COUNT(*) FROM Computers com
JOIN CPU cpu ON com.Computer_ID=cpu.Computer_ID
GROUP BY Country
)
SELECT cte.Country,[Cores per computer]=ISNULL(Cores,0)*1./Computers
FROM cte
LEFT JOIN cte2 ON cte.Country=cte2.Country
Вы не указали, как обрабатывать страны без ядер, поэтому я представляю их с 0 ядрами на компьютер.