Topic: sql Запрос подзапрос или group by

Здравствуйте, помоги пожалуйста правильно составить sql запрос

SELECT MIN(strftime("%d.%m.%Y -",Boev.BoevDate)) AS PeriodDate, MAX(strftime("%d.%m.%Y г.;",Boev.BoevDateEnd)) AS PeriodDateEnd, BoevName.BoevName FROM Boev LEFT JOIN BoevName ON Boev.id_BoevName=BoevName.id WHERE Boev.id_Client='+IntToStr(Form1.gridClient.dbItemID)+' GROUP BY BoevName.BoevName

Что то у меня не получается задуманное...

Имеется TableGrid1 с столбцами BoevName.BoevName, Boev.BoevDate, Boev.DateEnd к примеру со следующими значениями

BoevName.BoevName   Boev.BoevDate   Boev.BoevDateEnd
Пример                           01.01.2021         02.02.2021
Пример                           01.03.2021         02.03.2021
Пример2                         04.04.2021         02.05.2021
Пример2                         04.05.2021         05.05.2021
Пример3                         04.04.2021         05.05.2021
Пример3                         04.04.2021         05.05.2021



после выполнения sql запроса результат должен быть
BoevName.BoevName   Boev.BoevDate   Boev.BoevDateEnd
Пример                           01.01.2021         02.03.2021     
Пример2                         04.04.2021         05.05.2021     
Пример3                         04.04.2021         05.05.2021       

по столбцу BoevName.BoevName все отлично, группируют повторяющие и выводит одно наименование, но как мне правильно вывести дату начальную и конечную для одного наименования?

2 (edited by sibprogsistem 2021-09-06 21:53:26)

Re: sql Запрос подзапрос или group by

так может у Вас в БД ошибка?
от куда у Вас берутся парные записи?

Re: sql Запрос подзапрос или group by

Таблица BoevName связана с Boev, таблица Boev связана с основной Таблицей Client

BoevName - комбобокс для выбора значения

Re: sql Запрос подзапрос или group by

eugene1995miroshnikov wrote:

Таблица BoevName связана с Boev, таблица Boev связана с основной Таблицей Client

BoevName - комбобокс для выбора значения

Даты в одной таблице?

Re: sql Запрос подзапрос или group by

sibprogsistem wrote:
eugene1995miroshnikov wrote:

Таблица BoevName связана с Boev, таблица Boev связана с основной Таблицей Client

BoevName - комбобокс для выбора значения

Даты в одной таблице?

Да

Re: sql Запрос подзапрос или group by

Запрос бывает отбрасывает несколько строк, тем самым не получает Взять первую дату и конечную для определённого наименования. И я не могу сообразить как правильно оформить запрос, думаю сделать ещё подзапрос… или пробовать group by только для наименования делать, а на даты сделать запрос с min max where наименование=наименованию

7 (edited by sparrow 2021-09-07 11:28:11)

Re: sql Запрос подзапрос или group by

eugene1995miroshnikov wrote:

Запрос бывает отбрасывает несколько строк, тем самым не получает Взять первую дату и конечную для определённого наименования. И я не могу сообразить как правильно оформить запрос, думаю сделать ещё подзапрос… или пробовать group by только для наименования делать, а на даты сделать запрос с min max where наименование=наименованию

Было бы неплохо если бы вы приложили проект или пример.
Попробуйте запрос привести к виду

SELECT strftime("%d.%m.%Y -",MIN(Boev.BoevDate)) AS PeriodDate,
strftime("%d.%m.%Y г.;",MAX(Boev.BoevDateEnd)) AS PeriodDateEnd, 
BoevName.BoevName
...

Если вы избрали такое построение своей базы данных, то вам может быть сложновато с запросами.
Получение правильных дат и наименования не гарантирует вывода правильных значений в других колонках таблицы.
Запросы будут усложняться для получения, например id, с наименьшим или наибольшим значением даты.
Тогда вам действительно нужно будет сначала определить минимальную(максимальную) дату по наименованию в подзапросе,
а затем найти id по найденым наименованию и  дате в этой же таблице. Если у вас будут дополнительные поля в той же таблице порядок поиска их значений будет таким же как для id.

Re: sql Запрос подзапрос или group by

Было бы неплохо если бы вы приложили проект или пример.
Попробуйте запрос привести к виду

SELECT strftime("%d.%m.%Y -",MIN(Boev.BoevDate)) AS PeriodDate,
strftime("%d.%m.%Y г.;",MAX(Boev.BoevDateEnd)) AS PeriodDateEnd, 
BoevName.BoevName
...

Помогло. Спасибо большое.
Получается MIN MAX нужно перед преобразования в нужный формат даты…

9 (edited by sparrow 2021-09-07 11:33:55)

Re: sql Запрос подзапрос или group by

конечно
strftime() function returns the date formatted according to the format string.
Обратите еще внимание на то, что я дописал в сообщении выше.

Re: sql Запрос подзапрос или group by

вот еще два варианта

Post's attachments

Attachment icon test.rar 5.21 kb, 188 downloads since 2021-09-07 

11 (edited by millamakova 2021-10-16 19:41:07)

Re: sql Запрос подзапрос или group by

Здравствуйте!
Тоже столкнулась с дублированием записей в таблице.
Как сделать вывод записи Абонента только с более новой датой? Может кнопку с запросом сделать?
Записи берутся из отдельной таблички в карточке абонента.

Post's attachments

Attachment icon Таблица.jpg 415.47 kb, 92 downloads since 2021-10-16 

12 (edited by sparrow 2021-10-16 20:45:30)

Re: sql Запрос подзапрос или group by

Добрый,

Информации мало. Но если коротко то вам для кнопки с запросом нужно привести свой запрос к такому виду
(я напишу очень упрощенно):

SELECT Клиент, MAX(Дата)  FROM Таблица WHERE Ваши условия GROUP BY Клиент;

GROUP BY - Выведет уникального клиента т.е. 1 раз
MAX(Дата) - Выведет для этого 1 раза максимальную дату