Доступ к SQL-запросу с помощью JOIN и инструкции COUNT, которая ничего не считает

#sql #ms-access #ms-access-2013

#sql #ms-access #ms-access-2013

Вопрос:

У меня есть две таблицы в MS Access. Одна для планет и одна для типа звезды, вокруг которой она вращается.

Я хочу получить количество планет на звезду type…so что-то вроде:

  ---------- -------------------- 
| StarType | PlanetsPerStarType |
 ---------- -------------------- 
| A        |                  4 |
| B        |                  1 |
| C        |                  7 |
 ---------- -------------------- 
  

Итак, я написал этот SQL-запрос:

 SELECT StarType, COUNT(PlanetName) AS PlanetsPerStarType
FROM Planets AS p
LEFT JOIN StarClass AS s ON p.sid = s.sid
GROUP BY starType, PlanetName
  

Но в нем просто перечислены все планеты и 1 для всех типов звезд, на самом деле это вообще не считается.

Что я мог делать неправильно?

Комментарии:

1. PlanetName не должно быть в GROUP BY

Ответ №1:

Путем группировки по starType и PlanetName , счетчик возвращает количество записей в каждой комбинации starType amp; PlanetName , которое, если у вас нет более одной планеты с одинаковым названием, вращающейся вокруг вашей звезды, всегда будет равно одной.

Например, учитывая данные:

  ----------- ------------------ 
| StarType  |    PlanetName    |
 ----------- ------------------ 
| G2V       | Mars             |
| G2V       | Earth            |
| G2V       | Venus            |
| Red Dwarf | Omicron Persei 8 |
| Red Dwarf | Vergon 6         |
 ----------- ------------------ 
  

Группировка по StarType и PlanetName даст точно такие же данные, поскольку не существует повторяющихся комбинаций StarType и PlanetName , которые были бы объединены в группу.

Таким образом, SQL-код:

 select t.StarType, count(t.PlanetName) as Planets
from YourTable t
group by t.StarType, t.PlanetName
  

Приведет к:

  ----------- --------- 
| StarType  | Planets |
 ----------- --------- 
| G2V       |       1 |
| G2V       |       1 |
| G2V       |       1 |
| Red Dwarf |       1 |
| Red Dwarf |       1 |
 ----------- --------- 
  

Поскольку каждая группа содержит ровно одну запись.

Если вместо этого мы сгруппируем только по StarType , Count агрегатная функция вернет количество записей, связанных с каждой StarType :

 select t.StarType, count(t.PlanetName) as Planets
from YourTable t
group by t.StarType
  
  ----------- --------- 
| StarType  | Planets |
 ----------- --------- 
| G2V       |       3 |
| Red Dwarf |       2 |
 ----------- ---------