Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/64: Рейтинг темы: голосов - 64, средняя оценка - 4.97
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406

Запрос на сравнение данных двух полей

11.05.2017, 16:19. Показов 12326. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую
Название темы немного коряво, но я что-то тупю, не могу сформировать запрос который при группировке данных выполняет два условия одновременно.
Имеется поле "Название" и логическое поле "Правда".
Нужно так сгруппировать данные этих полей чтобы если в поле Правда значение ДА то группировались только записи, у которых есть это значение в поле Правда, а записи где поле Правда имеет значение Нет не группировались.
Но если в записи, где имеется такое-же поле Название но в поле Правда нет ни одного значения ДА, то записи этих полей все равно группировались.

Иначе - группировка записей происходила независимо от значения в поле Правда, но если в этом поле значение Да, то записи со значением Нет не выводились.

Может решение простое, но я что-то запутался.

Индикатором какие именно записи сгруппировались может служить поле Счетчика.
Вложения
Тип файла: rar Database2.rar (12.6 Кб, 8 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2017, 16:19
Ответы с готовыми решениями:

Сравнение значений полей двух таблиц баз данных: Подскажите новичку
Здравствуйте! Подскажите, пожалуйста, как можно реализовать такую задачу: Есть 2 таблицы типа Paradox с заполненными полями, одна...

Сравнение полей и запрос
Всем доброго времени суток. Будем без трагичностей ;) Есть 2 таблицы (таблица1, таблица2) и CSV файл. Как сделать чтобы инфа по...

Сравнение полей из двух таблиц
Добрый день! Суть проблемы в следующем: имеются две таблицы: 1.Документы, которые дошли до отдела 2.Полный список документов ...

18
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
11.05.2017, 16:34
Возможно неправильно понял. Попробуйте такой запрос, где первый блок юнион содержит наименования где Правда=True, а второй только те где ни у одного наименования нет True в поле Правда
SQL
1
2
3
4
5
6
7
8
9
SELECT MAX(Таблица1.[Код]) AS [Max-Код], Таблица1.[Название], TRUE AS Истина
FROM Таблица1
WHERE [Правда]
GROUP BY Таблица1.[Название], Таблица1.[Правда]
UNION ALL
SELECT MAX(Таблица1.[Код]) AS [Max-Код], Таблица1.[Название], FALSE AS Истина
FROM Таблица1
GROUP BY Таблица1.[Название]
HAVING SUM(Правда)=0
1
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
12.05.2017, 08:07  [ТС]
Да, все работает как нужно но в режиме конструктора это не сделать как я понял, так?
Просто в реале полей гораздо больше и писать это все на SQL мне сложновато, но в любом случае благодарю!
0
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
12.05.2017, 10:01
Лучший ответ Сообщение было отмечено sysghost как решение

Решение

sysghost, достаточно просто сделать как Вы хотите:
- в конструкторе создайте нужный запрос со всеми полями. В графе Правда задайте условие True (Истина) и дайте нужные группировки.
- перейдите в режим SQL, удалите в конце выражения точку с запятой и скопируйте выражение
- на новой строке напишите UNION ALL
- перейдите на новую строку и вставьте из буфера скопированное.
- удалите во втором блоке предложение Where целиком
- в самом конце напишите в Having условие HAVING SUM(Правда)=0
Вот и все. Большая часть со всеми полями делается в конструкторе. Только чуть в скл.
1
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
12.05.2017, 12:01  [ТС]
Благодарю за помощь и развернутый ответ.
0
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
12.05.2017, 14:43  [ТС]
Да, как я и предполагал вылезут какие то грабли.
Вот например стоило изменить тип поля да-же в этом простом примере и уже не могу заставить его работать, вот два неудачных запроса, где косяк?

Кроме того у меня в запросе директива не GROUP BY а ORDER BY.
Нашел да-же описание этих запросов на объединение у мелкомягких - https://support.office.com/ru-... u-RU&ad=RU но и по их инструкции что то не срастается.
Хоть пример оживите пожалуйста, может так хоть пойму механизм этого чудо запроса.
Вложения
Тип файла: rar Database2.rar (15.4 Кб, 4 просмотров)
0
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
12.05.2017, 15:43  [ТС]
Попробуем иначе, я изложу ход своих мыслей а Вы подскажете где у меня косяк в понимании.
Итак, имеем начальный запрос который выглядит так:
SQL
1
2
3
4
5
SELECT MAX(Таблица1.Код) AS [Max-Код], Таблица1.Название, Таблица1.Правда
FROM Таблица1
GROUP BY Таблица1.Название, Таблица1.Правда
HAVING (((Таблица1.Правда)="Нет"))
ORDER BY Таблица1.Название;
SELECT - выбирает поля таблицы
FROM - выбирает саму таблицу
GROUP BY - производит группировку по полям Название и Правда
HAVING - указывает условие этой группировки для поля Правда
ORDER BY - сортирует данные поля Название
--------------
Теперь нам нужно прикрепить к данным выбранным в первом запросе данные выбранные во втором.
Для этого прикрепляем второй набор данных инструкцией UNION ALL
Если мы повторим полный текст предыдущего запроса то получим дубль данных первого запроса, если только инструкция UNION то данные первого и второго запросов сгруппируются вместе и будут выглядеть как первый запрос.
-------------
Если мы изменим условие группировки первого запроса на
SQL
1
HAVING (((Таблица1.Правда)="Да"))
То получим второй набор данных но уже в поле Правда будут значения Да и не важно будет ли UNION ALL или просто UNION совпадений не предвидеться.

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

Опять нужно провести HAVING но уже по объединенному результату?
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
12.05.2017, 15:48
sysghost,

Вы используете HAVING не по назначению.
HAVING - для агрегированных данных.
В приведенном запросе достаточно WHERE.
0
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
13.05.2017, 11:10  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
В приведенном запросе достаточно WHERE.
Так то сам access так сформировал запрос.
Причем в другом варианте у меня было и WHERE, не понимаю как так получается, но то не мой выбор а конструктора access.
Кроме того это простенький пример, в моем варианте полей больше и условий то-же.
Мне бы саму задумку понять.

Добавлено через 19 часов 2 минуты
В общем воз и ныне там.
Эта задача вобще решаема?
0
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
13.05.2017, 12:25  [ТС]
В общем огородами таки удалось решить проблему, понадобилось аж три запроса, если можно проще, напишите пожалуйста.
Вложения
Тип файла: rar Database2.rar (57.0 Кб, 7 просмотров)
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
13.05.2017, 16:50
Цитата Сообщение от sysghost Посмотреть сообщение
понадобилось аж три запроса
Да еще один из них - перекрестный...
Вот вариант:
SQL
1
2
3
4
5
6
7
SELECT MIN(Код) AS Min_Код, Название, IIf(FIRST(B),"Да","Нет") AS [Да/Нет]
FROM
(SELECT * FROM Таблица1 WHERE B
UNION ALL
SELECT * FROM Таблица1 AS T
WHERE (SELECT SUM(Название=T.Название AND NOT B) FROM Таблица1)=(SELECT SUM(Название=T.Название) FROM Таблица1))
GROUP BY Название;
Здесь B - логическое поле вместо удивительного текстового поля Правда.
1
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
15.05.2017, 08:11  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
Да еще один из них - перекрестный...
Вот вариант:
Благодарю, но увы не работает почему то.
Вложения
Тип файла: rar Database2.rar (58.6 Кб, 2 просмотров)
0
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
15.05.2017, 08:35  [ТС]
Вообще то преобразование к логическому типу поля не совсем подходящий вариант, если в поле предусмотрено только два значения, то годится, но их может быть и больше, хотелось бы более универсальный вариант.
Перекрестный запрос как раз и позволяет сгруппировать любое количество вариантов, конечно если таковые заранее предполагаются и вывести итоговое поле с нужной логикой отбора, например если отсутствуют оба базовых варианта ответа то выбрать третий или четвертый, кроме того можно и сгруппировать не только два но и любое количество вариантов.
Но если Ваш пример для двух значений заработает, то для простых вариантов он конечно будет предпочтительнее.

Добавлено через 11 минут
Решение могло бы быть проще если бы я смог исключить из списка сгруппированных записей с значением Нет или как то еще, записи сгруппированные по значению Да (или как-то еще), но я не нашел условия исключающего список значений одного поля из списка другого, что то вроде Not Like ([Правда]).
0
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
15.05.2017, 09:14
Если считать, что Ваш запрос 1_П_Таблица1 правильный, то есть и другое решение
SQL
1
2
3
4
5
SELECT Название, 
(SELECT MIN(Код) FROM Таблица1 t WHERE Правда="Да" AND t.Название=Таблица1.Название) AS Да,
(SELECT MIN(Код) FROM Таблица1 t WHERE Правда="Нет" AND t.Название=Таблица1.Название) AS Нет
FROM Таблица1
GROUP BY Название
1
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
15.05.2017, 12:38  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
Если считать, что Ваш запрос 1_П_Таблица1 правильный
Ну это 1 из трех, последний - 3_З_Таблица1, Ваш заменяет перекрестный только, возможно он и лучше, пока не разбирался.
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
15.05.2017, 13:44
Цитата Сообщение от sysghost Посмотреть сообщение
увы не работает почему то.
Во-первых, "не работает" - это не ответ.
Нужна конкретика - что происходит, как, ... - со всеми подробностями.
Во-вторых, в таблице нет поля B.
Естественно, для выполнения запроса это поле следовало создать и проставить галочки в записях, где Правда="Да".
На это все меньше двух минут нужно.

Ну хорошо.
Вот аналогичный запрос не с полем B, а с полем Правда.
SQL
1
2
3
4
5
6
7
8
SELECT MIN(Код) AS Min_Код, Название, FIRST(Правда) AS [Да/Нет]
FROM 
(SELECT * FROM Таблица1 WHERE Правда="Да"
UNION ALL
SELECT * FROM Таблица1 AS T
WHERE (SELECT SUM(Название=T.Название AND Правда="Нет") FROM Таблица1)=
      (SELECT SUM(Название=T.Название) FROM Таблица1)) AS Q
GROUP BY Название;
Добавлено через 11 минут
Вижу, в поле Правда теперь еще и третье значение есть (приводить его не буду).
Тогда запрос уточняется:
SQL
1
2
3
4
5
6
7
8
SELECT MIN(Код) AS Min_Код, Название, FIRST(Правда) AS [Да/Нет]
FROM 
(SELECT * FROM Таблица1 WHERE Правда="Да"
UNION ALL
SELECT * FROM Таблица1 AS T
WHERE (SELECT SUM(Название=T.Название AND Правда<>"Да") FROM Таблица1)=
      (SELECT SUM(Название=T.Название) FROM Таблица1)) AS Q
GROUP BY Название;
1
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
16.05.2017, 08:08  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
Во-первых, "не работает" - это не ответ.
Нужна конкретика - что происходит, как, ... - со всеми подробностями.
Во-вторых, в таблице нет поля B.
Естественно, для выполнения запроса это поле следовало создать и проставить галочки в записях, где Правда="Да".
На это все меньше двух минут нужно.
Ну так я же пример выложил, думал этого достаточно, насчет третьего поля не догадался.
Более подробно я описал в посте ниже того ответа, я его дополнял но в один пост дополнение увы не склеилось автоматически.
---------
Опять не всё гладко.
Если Вы обратите внимание на результаты запросов "РезультатВаш" и "РезультатМой" то можно заметить что хоть соответствие полей "Название" и "Да/Нет" совпадают, в полях счетчика и Мах-Число не сходятся, проверить что верно можно по Таблице 1.
Но за помощь благодарю, просто сейчас нет времени на анализ проблемы, занимаюсь параллельно другой работой.
Пример в приложении.
Вложения
Тип файла: rar Database2.rar (63.1 Кб, 5 просмотров)
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
16.05.2017, 10:52
sysghost,

Разумеется, я видела расхождение в определении минимального кода группы.
Само собой.
Но считаю, что мои результаты соответствует условиям, изложенным в стартовом посте,
а Ваши результаты - нет.
У Вас в группу попадают записи с полем Правда="Нет", при том, что для этих Названий
есть записи с полем Правда="Да". То есть, записи с "Нет" для этих Названий должны,
согласно условию, исключаться из рассмотрения.
Для Оранжевого и Голубого, кажется.
Могу ошибиться - пишу с планшета, базу Вашу не смотрю.

И занимаюсь параллельно своей собственной работой.
0
 Аватар для sysghost
40 / 40 / 6
Регистрация: 12.01.2016
Сообщений: 406
16.05.2017, 11:59  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
sysghost,
Разумеется, я видела расхождение в определении минимального кода группы.
Само собой.
Но считаю, что мои результаты соответствует условиям, изложенным в стартовом посте,
а Ваши результаты - нет.
У Вас в группу попадают записи с полем Правда="Нет", при том, что для этих Названий
есть записи с полем Правда="Да". То есть, записи с "Нет" для этих Названий должны,
согласно условию, исключаться из рассмотрения.
Для Оранжевого и Голубого, кажется.
Могу ошибиться - пишу с планшета, базу Вашу не смотрю.
И занимаюсь параллельно своей собственной работой.
Нет, такой проблемы ни у меня, ни у Вас нет.
В группу Да попадают только 4 цвета - Красный, Оранжевый, Желтый, Зеленый.
Это условий соблюдается в обоих вариантах, а вот другие поля привязываются по разному.
Я Вам благодарен за помощь и понимаю что Вам возможно не до этого, как сейчас и мне, пишу вот в обеденный перерыв, возможно Ваш вариант после небольшой доработки вполне подойдет, просто обратил внимание на этот момент и все, еще раз благодарю за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2017, 11:59
Помогаю со студенческими работами здесь

Сравнение полей двух DbGrid
у меня такая проблема, я не знаю как сравнить поля Naimenovan 2-х DbGrid-ов, и если например они равны то значения полей chena сложить и...

Сравнение двух полей на схожесть значений
Задача может показаться глупой. Есть таблица(к примеру): Списки КОД | Значение 1 | Хлеб,Молоко,Печенье 2 |...

Сравнение двух полей в одной теблице?
Добрый день. Есть таблица Поле1 Поле2 Поле3 BYN,USD BYN BYN,USD,EUR USD USD ...

Сравнение двух полей в разных классах
У меня есть класс &quot;Кассир&quot; и класс &quot;Продукт&quot;. В классе &quot;Кассир&quot; есть метод который добавляет в покупку товар по штрих коду. Вот метод: ...

сравнение значений полей двух объектов структуры
допустим, у меня есть структура, два ее объекта и переменная, которая изначально равна 0: type TStruct = Record first :...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 31.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru