1 (edited by Andrei 2021-03-30 09:38:54)

Topic: Select помощь в написании

Здравствуйте.
Подскажите пожалуйста как выбрать из таблицы Res  записи по 3 принтерам (группировка) для MAX значения поля res.res и условия что id_priznak = 1
                            Res                                                          print                                                         Искомый результат???
id | id_ print |       date       |  res  | id_priznak |               id |      model     |                       res.id |    print.model    |        res.date      |    res.res     |   
1 |      1       | 2021-01-01 |  10   |       1          |               1 |    HP2055    |                           4    |       HP2055      |     2021-01-04    |       40        |
2 |      1       | 2021-01-02 |  20   |       1          |               2 | Xerox 3025  |                           7    |    Xerox 3025   |     2021-01-03    |        30       |
3 |      1       | 2021-01-03 |  30   |        2         |               3 | Xerox 3100  |                          10   |    Xerox 3100   |      2021-01-02   |        20       |   
4 |      1       | 2021-01-04 |  40   |       1          |
5 |      2       | 2021-01-01 |  10   |       1          |
6 |      2       | 2021-01-02 |  20   |        1         |
7 |      2       | 2021-01-03 |  30   |        1         |
8 |      2       | 2021-01-04 |  40   |       2          |
9 |      3       | 2021-01-01 |  10   |       2          |
10|      3       | 2021-01-02 |  20   |        1         |
11|      3       | 2021-01-03 |  30   |        2         |
12|       3      | 2021-01-04 |  40   |       2          |

2 (edited by Andrei 2021-04-05 17:50:21)

Re: Select помощь в написании

Получилось написать неверный скрипт(((.
Поля res.id_print, print.name, res.date вытаскиваются для первого значения WHERE res.id_Priznzam = 1, а нужно чтобы вытаскивались для id  = MAX(res) from res  WHERE res.id_Priznzam = 1.
Нужен подзапрос, но как не крутил - ошибка.

procedure FrmOth1_Button14_OnClick (Sender: TObject; var Cancel: boolean);
begin
 frmOth1.Button14.dbSQL :=   ' select res.id_print, print.name, res.date, MAX(res.res)  '+
                                    ' FROM res LEFT OUTER JOIN print ON res.id_print=print.id '+
                                    ' WHERE res.id_Priznzam = 1 '+
                                    ' GROUP BY res.id_print ';
end;

3 (edited by sibprogsistem 2021-04-06 15:12:19)

Re: Select помощь в написании

попробуйте такое

select res.id_print, print.name, res.date, MAX(res.res) as maxRes From res 
LEFT UOTER JOIN print ON res.id_print=print.id WHERE GROUP BY res.id_print

без проекта все равно не понятно

4 (edited by Andrei 2021-04-06 17:39:28)

Re: Select помощь в написании

Создал свой неправильный проект.
Нужно вытащить последние записи замены картриджей для всех принтеров

Post's attachments

Attachment icon res.zip 336.05 kb, 196 downloads since 2021-04-06 

Re: Select помощь в написании

ну так-то так

select 
res.id_print as id       
, print.model as name     
, res.date as date    
, res.res as Res 
From res
LEFT OUTER JOIN print ON res.id_print=print.id 
WHERE res.id_Priznak = 1
GROUP BY print.model  

может Вы имели введу сумму ?

select 
res.id_print as id       
, print.model as name     
, res.date as date    
, SUM(res.res) as Res 
From res
LEFT OUTER JOIN print ON res.id_print=print.id 
WHERE res.id_Priznak = 1
GROUP BY print.model   

ORDER BY - позволяет сортировать записи по определенному полю (ASC  < по умолчанию ) (DESC >) limit - количество записей
ORDER BY имя_поля DESC limit 1


GROUP BY - позволяет группировать результаты при выборке из базы данных

Re: Select помощь в написании

немножко не то.
Если мы делаем select

select 
res.id_print as id       
, print.model as name     
, res.date as date    
, res.res as Res 
From res
LEFT OUTER JOIN print ON res.id_print=print.id 
WHERE res.id_Priznak = 1
GROUP BY print.model  

в поля будут вставлены первые значения из таблицы для значений WHERE res.id_Priznak = 1 с группировкой GROUP BY print.model 
МОЯ ЦЕЛЬ:
нужно в таблице выбрать последние строки создать подзапрос, что то типа

MAX(id) FROM res WHERE id_priznak =1
 для каждого id_print

Вполне возможно группировка и не нужна???
ЧТО ТО ВРОДЕ ЭТОГО

select 
res.id_print as id       
, print.model as name     
, res.date as date    
, res.res as Res 
From res
LEFT OUTER JOIN print ON res.id_print=print.id 
WHERE (select id FROM res WHERE id_priznak =1)
????? и должно быть условие что id = MAX(ID) FROM res WHERE id_priznak =1 для каждого id_print

Ощущение что нужно создавать временные таблицы

7 (edited by k245 2021-04-07 07:46:38)

Re: Select помощь в написании

Временные таблицы тут не нужны, нужен запрос:

select 
  res.id,
  p.model,
  res.date,
  res.res
from res
left join print p on p.id = res.id_print
where 
  res.res = (select max(res) 
             from res r 
             where (r.id_print = res.id_print) and (r.id_priznak = 1) )

По вашей базе он выдает такой результат:


http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=7649&amp;download=0

Post's attachments

Attachment icon Результат.png 18.15 kb, 111 downloads since 2021-04-07 

Визуальное программирование: блог и телеграм-канал.

8 (edited by Andrei 2021-04-07 08:51:23)

Re: Select помощь в написании

Ребята.
Константин.
Огромное спасибо.
То что нужно.
Не представляете сколько различных вариантов я перепробовал...
"Как собака. Понимаю, а написать не могу..."