Подсчет записей с некоторыми условиями в таблице и отображение с помощью кнопки на форме - PullRequest
0 голосов
/ 04 июля 2019

В Access у меня есть эта таблица tblcls

tblcls

У меня есть кнопка на форме. Мне нужен некоторый код / ​​vba / SQL и т. Д. Для этой кнопки, поэтому, когда мой клиент нажимает на нее, они видят что-то вроде в image2. Где, например. Штат ОК имеет 2 класса английского, 4 класса по математике и 3 класса по естествознанию. Обратите внимание, что больше не будет классов, поэтому больше не будет столбцов, но будет больше штатов и городов, поэтому таблица будет расти по строкам.

enter image description here

1 Ответ

1 голос
/ 04 июля 2019

Предполагая, что любое из трех полей класса может содержать любого субъекта, желаемый результат может быть получен с помощью простого условного агрегирования, например ::

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

Прелесть этого подхода в том, что если позже вы решите добавить или удалить класс, город или штат, запрос останется неизменным, поскольку ничего не было жестко закодировано - после добавления другого класса имя класса автоматически появится в Результаты запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...