Среднее 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 ядрами на компьютер.

Другие вопросы по тегам