Предполагая, что любое из трех полей класса может содержать любого субъекта, желаемый результат может быть получен с помощью простого условного агрегирования, например ::
select
t.state,
-Sum(t.[Class 1]="English" or t.[Class 2]="English" or t.[Class 3]="English"),
-Sum(t.[Class 1]="Maths" or t.[Class 2]="Maths" or t.[Class 3]="Maths" ),
-Sum(t.[Class 1]="Science" or t.[Class 2]="Science" or t.[Class 3]="Science")
from tblcls t
group by t.state
Тем не менее, грубость и несоответствие этого решения связано с тем, что ваша база данных не соответствует правилам нормализации базы данных .
Например, поскольку штат может предлагать много классов, а класс может преподаваться во многих штатах, вы работаете с отношением «многие ко многим» между состояниями и классами и, таким образом, лучшим способом структурирования базы данных, пока придерживаясь правил нормализации базы данных будет использовать таблицу соединений .
Следовательно, по крайней мере у вас может быть четыре таблицы:
States
+--------------+
| StateID (PK) |
| StateName |
+--------------+
Город
+--------------+
| CityID (PK) |
| StateID (FK) |
| CityName |
+--------------+
Классы
+--------------+
| ClassID (PK) |
| ClassName |
+--------------+
City_Class_Xref
+--------------+
| ID (PK) |
| CityID (FK) |
| ClassID (FK) |
| StartDate |
| EndDate |
| Cost |
+--------------+
С этой структурой теперь есть много способов получить желаемый результат - один из возможных способов - использовать запрос кросс-таблицы, например ::
.
transform count(*)
select states.statename
from
states inner join
(
cities inner join
(
classes inner join city_class_xref on
classes.classid = city_class_xref.classid
)
on cities.cityid = city_class_xref.cityid
)
on states.stateid = cities.stateid
group by states.statename
pivot classes.classname
Прелесть этого подхода в том, что если позже вы решите добавить или удалить класс, город или штат, запрос останется неизменным, поскольку ничего не было жестко закодировано - после добавления другого класса имя класса автоматически появится в Результаты запроса.