powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос LEFT JOIN с применением статистических выражений
13 сообщений из 13, страница 1 из 1
Запрос LEFT JOIN с применением статистических выражений
    #39507518
Denis Komarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

В рамках одной БД имеется две таблицы (проверки и ошибки).

TableA (TableA.ID, TableA.Datechecks, TableA.CheckedFIO, TableA.CheckTypes)
TableB (TableB.ID, TableB.IDA, TableB.Mistake, TableB.MistakeCriticality)

Необходимо подготовить запрос, который бы отображал следующие данные:
ФИО, Кол-во проверок, Общее кол-во ошибок, Кол-во ошибок_Ошибка, Кол-во ошибок_Гр.ошибка, Кол-во проверок без ошибок, кол-во проверок без грубых ошибок.

Подобный запрос смог реализовать только без группировки по ФИО, вот что получилось (уверен, что можно было бы еще проще написать):

авторSELECT (SELECT COUNT(*)
FROM (SELECT DISTINCT TableA.ID FROM TableA LEFT JOIN TableB ON TableA.ID = TableB.IDA)) AS Проверки,
COUNT(TableB.ID) AS Ошибки,
SUM(IIf(TableB.MistakeCriticality='Грубая ошибка',1,0)) AS Ошибки_ГРУБАЯ,
SUM(IIf(TableB.MistakeCriticality='Ошибка',1,0)) AS Ошибки_ОШИБКА,
(SELECT COUNT(*) FROM (SELECT DISTINCT TableA.ID
FROM TableA
LEFT JOIN TableB
ON TableA.ID = TableB.IDA WHERE TableB.IDA IS NULL)) AS Проверки_без_ошибок,
(Проверки-(SELECT COUNT(*) FROM (SELECT DISTINCT TableA.ID
FROM TableA
LEFT JOIN TableB ON TableA.ID = TableB.IDA
WHERE TableB.MistakeCriticality = 'Грубая ошибка'))) AS Проверки_без_Грубых_ошибок
FROM TableA LEFT JOIN TableB ON TableA.ID = TableB.IDA

При попытке добавить группировку по ФИО, т.е. добавляю поле TableA.CheckedFIO и в конце пишу GROUP BY TableA.CheckedFIO, выдает актуальные данные только по "Ошибки", "Ошибки_ГРУБАЯ", "Ошибки_ОШИБКА", все остальные данные имеют одинаковое значение, т.е. сумму, без разбивки по конкретным ФИО.

Пожалуйста, помогите составить корректный запрос, чтобы все значения в данных отображались с учетом группировки по ФИО.

Заранее спасибо!

PS: Прикрепил тестовую БД с картинкой таблички, результаты которые должны быть.
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39507544
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Составьте объединяющий запрос, дающий детальные данные. Используйте его как источник для перекрёстного запроса.
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39507599
Попробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT Проверки.CheckedFIO, Проверки.ВсегоПроверок, Ошибки.Ошибки_ВСЕ, 
Ошибки.Ошибки_ГРУБАЯ, Ошибки.Ошибки_ОШИБКА,  
Проверки.ВсегоПроверок - Ошибки.Ошибки_ВСЕ As Проверки_без_ошибок
Проверки.ВсегоПроверок - Ошибки.Ошибки_ГРУБАЯ  AS Проверки_без_Грубых_ошибок
FROM (SELECT CheckedFIO, Count(*) As ВсегоПроверок GROUP BY CheckedFIO) As Проверки 
LEFT JOIN (SELECT TableA.CheckedFIO, COUNT(*) As Ошибки_ВСЕ,
                  SUM(IIf(TableB.MistakeCriticality='Грубая ошибка',1,0)) AS Ошибки_ГРУБАЯ,
                  SUM(IIf(TableB.MistakeCriticality='Ошибка',1,0)) AS Ошибки_ОШИБКА
                  FROM TableA LEFT JOIN TableB ON TableA.ID = TableB.IDA
                  GROUP BY TableA.CheckedFIO) AS Ошибки
ON Проверки.CheckedFIO = Ошибки.CheckedFIO
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39507712
Denis Komarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),

Что-то он у меня не срабатывает. Не могли бы Вы написать запрос именно по модели бд, которую я прикладывал?!
Заранее спасибо!
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39507742
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Komarov,
Код: vbnet
1.
2.
3.
4.
5.
SELECT Checks.CheckedFIO, Count(CheckMistakes.ID_Check) AS [Count-ID_Check],
-Sum(Not IsNull([Mistake_Criticality])) AS [с ошибками], -Sum(IsNull([Mistake_Criticality])) AS [без ошибок], -Sum([Mistake_Criticality]="ошибка") AS ошибка,
-Sum([Mistake_Criticality]="грубая ошибка") AS грубая
FROM Checks INNER JOIN CheckMistakes ON Checks.ID = CheckMistakes.ID_Check
GROUP BY Checks.CheckedFIO;
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39507767
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а лучше правильнее так:
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39508321
Denis Komarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku, спасибо за готовый запрос! К сожалению, он не совсем корректен с точки зрения тз. Он отображает не кол-во проверок, а кол-во строк ... В связи с тем, что у нас идет LEFT JOIN то выводятся все записи из таблицы проверки и ошибки. Таким образом у нас получается "задвоение" проверок. Тут нужно использовать принцип тот, что описал Анатолий ( Киев ) и Akina, но просто у меня он не сработал.
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39508344
Denis KomarovЧто-то он у меня не срабатывает Что значит "не срабатывает"?
Запрос строится на двух подзапросах. Создайте из них два сохраненных запроса, на них постройте основной. Если результат устроит - можете собрать всё в одном запросе.
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39508409
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Komarov,
в предложенном примере изменена структура БД(в этом основной смысл моего предложения) что же касается количества строк и количества проверок-разве это не одно и то же (1 проверке соответствует 1 строка в таблице и запрос подсчитывает именно количество)
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39508529
Denis Komarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,
Изменение структуры БД не по ТЗ :) Если применить INNER JOIN (к той модели БД, которую я выкладывал), то у Вас будут выведены только те значения, в которых пересекаются ID и ID_Check. Таким образом Вы потеряете проверки, которые были без ошибок.
Если использовать LEFT JOIN с учетом Вашего запроса, происходит задвоение/затроение и т.п. кол-ва проверок, т.к. в одной проверке могут быть несколько ошибок.

Анатолий ( Киев ),
Запрос уже составил по предложенному Вами и Akina способом. Спасибо за помощь!
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39508557
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Komarovsdku,
Изменение структуры БД не по ТЗ Информация к размышлению:а Вы уверены, на 100%, что оператор набирая, далеко не первый раз "Федоров Федор Федорович", не допустит какую-либо ошибку и создаст запись отличающуюся от предыдущих (при этом запрос выдаст неверные, для Вас, результаты)
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39508596
Denis Komarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku,

Я что-то не понял о чем вы. :) что Вы имеете ввиду? Речь идет о заполнении бд или что?
...
Рейтинг: 0 / 0
Запрос LEFT JOIN с применением статистических выражений
    #39508611
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Komarov,
Речь именно о заполнении. Одной из главных задач разработчика считаю-не позволить юзеру ввести данные,которые нарушат работу БД. При Вашей структуре ошибка в заполнении приведет к неправильной работе БД (а зачем нужна база,которая при малейшей ошибке будет некорректно работать. Федоров Федор Федорович<> Федоров Фёдор Федорович)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос LEFT JOIN с применением статистических выражений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]