Topic: Максимальное значение (Max) K2_1,K2_2,K2_3,K2_4,K2_5

Добрый день, подскажите пожалуйста как получить максимальное значение из полученных данных, а именно сделал процедуру, все протестировал по отдельности, работает, теперь нужно чтобы К2 был равен максимальному значению из K2_1,K2_2,K2_3,K2_4,K2_5, в интернете поискал но там в основном выборка из массива, а мне нужно не из массива, по видимому нужно задать минимальное и максимальное значение и соответствующее сравнение, подскажите как реализовать ?

Заранее благодарю     

procedure Insurance_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
K1,K2,K2_1,K2_2,K2_3,K2_4,K2_5,K3,K4,K5,K6: Double;
begin
  If Insurance.ComboBox12.Text = '  ' then
     K3:= 1
     else
     K3:= 1.6;
  begin
  K1:= sqlexecute('select TypeVehicleRatio from TypeVehicle where TypeAuto = "'+Insurance.ComboBox2.Text+'"');
  K4:= sqlexecute('select LocationRatio from RegistrationAuto where LocationAuto = "'+Insurance.ComboBox1.Text+'"');
  K5:= sqlexecute('select DiagnCardRatio from DiagnosticCard where DiagnCardYesNo = "'+Insurance.ComboBox9.Text+'"');
  K6:= sqlexecute('select InsPeriodRatio from InsurancePeriod where InsPeriod = "'+Insurance.ComboBox10.Text+'"');
  //K2:=  Max(K2_1,K2_2,K2_3,K2_4,K2_5);
  K2_1:= sqlexecute('select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox4.Text+'"');
  K2_2:= sqlexecute('select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox5.Text+'"');
  K2_3:= sqlexecute('select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox6.Text+'"');
  K2_4:= sqlexecute('select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox7.Text+'"');
  K2_5:= sqlexecute('select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox8.Text+'"');
  Insurance.edit1.value:= 1680*K1*K2(?)*K3*K4*K5*K6;
    end;
    end;

2 (edited by sparrow 2022-09-07 08:28:31)

Re: Максимальное значение (Max) K2_1,K2_2,K2_3,K2_4,K2_5

Для SQLite это выглядит так:

SELECT max(поле1, поле2, поле3 ... ) FROM ... WHERE ...

Для вас:

K2 := StrToFloat(sqlexecute('SELECT max((select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox4.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox5.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox6.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox7.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox8.Text+'") '));

Вычисляются значения по вашим запросам а затем находится максимальное из них.


или для SQLite и MYSQL


SELECT поле1 FROM ... WHERE ...
UNION ALL
SELECT поле2 FROM ... WHERE ...
UNION ALL
SELECT поле3 FROM ... WHERE ...
...
ORDER BY 1 DESC LIMIT 1;

для вас

K2 := StrToFloat(sqlexecute('select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox4.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox5.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox6.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox7.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox8.Text+'" '+
' ORDER BY 1 DESC LIMIT 1'));

3 (edited by NickB 2022-09-08 04:25:40)

Re: Максимальное значение (Max) K2_1,K2_2,K2_3,K2_4,K2_5

Ок, спасибо большое, такой крутой запрос-выборка yikes smile

Re: Максимальное значение (Max) K2_1,K2_2,K2_3,K2_4,K2_5

sparrow, спасибо большое еще раз,

1й вариант не сработал пишет синтаксис эрор

K2 := StrToFloat(sqlexecute('SELECT max((select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox4.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox5.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox6.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox7.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox8.Text+'") ')); 

а 2й работает отлично

K2 := StrToFloat(sqlexecute('select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox4.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox5.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox6.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox7.Text+'" '+
' UNION ALL '+
' select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox8.Text+'" '+
' ORDER BY 1 DESC LIMIT 1'));


И просьба, посоветуйте пжл какую нибудь книгу или материал по SQLite либо по MYSQL, чтобы можно было делать подобные запросы и выборки, а то в инете кусками

Заранее благодарен!

5 (edited by sparrow 2022-09-08 07:24:09)

Re: Максимальное значение (Max) K2_1,K2_2,K2_3,K2_4,K2_5

В первом варианте я ошибся со скобкой. Вот так должно работать

K2 := StrToFloat(sqlexecute('SELECT max((select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox4.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox5.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox6.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox7.Text+'"), '+
' (select AgeExpDrRatio from AgeExpDriver where AgeExpDriving = "'+Insurance.ComboBox8.Text+'")) '));

Я не был уверен какую базу данных вы используете, поэтому дал два варианта.
Второй запрос универсальный.
В первом и втором варианте нет ничего сложного. Функция МАХ(Столбец1) в SQL работает со столбцом .
В первом варианте используется одна особенность SQLite для МАХ. max(X,Y,...) где вместо значений мы
писали подзапросы для вычисления значений.
Во втором варианте мы формировали столбец из значений с помощью объединений (UNION ALL).
Затем сортировали его в порядке убывания (ORDER BY 1 DESC) где 1 это номер столбца.
И вывод в программу только одной строки (LIMIT 1)



Книги даны в порядке повышения знаний:



- Бен Форта - SQL за 10 минут, ( за 10 минут не выучите но книга неплохая)
- Изучаем SQL. Генерация, выборка и обработка данных, 3-е изд./ Алан Болье

для среднего уровня и выше

SQL. Сборник рецептов - Энтони Молинаро


и еще много много других ... )))


Все книги останутся книгами без упражнений и самостоятельных проб в SQL.

Re: Максимальное значение (Max) K2_1,K2_2,K2_3,K2_4,K2_5

ок, спасибо большое, очень вам благодарен