используйте инструкцию sql case в запросе delphi

#sql #delphi

Вопрос:

поэтому я хочу вычислить сумму поля с помощью запроса и оператора case в delphi ; код, который я использую, следующий :

 DataModule2.ADOQuery1_630.sql.clear;
     DataModule2.ADOQuery1_630.sql.Add('select STATUT,case  when month(DATE_PAI)=1 then sum(MT) else 0 end  AS m');
     DataModule2.ADOQuery1_630.sql.Add('from table');
     DataModule2.ADOQuery1_630.sql.Add('where  STATUT in( :dd ,:df) and TYPE_QUIT = :l ');
     DataModule2.ADOQuery1_630.sql.Add('group by STATUT');
     DataModule2.ADOQuery1_630.Parameters.ParamByName('dd').Value:=pm;
     DataModule2.ADOQuery1_630.Parameters.ParamByName('df').Value:=pp;
     DataModule2.ADOQuery1_630.Parameters.ParamByName('l').Value:=typeQ;
     DataModule2.ADOQuery1_630.prepared := true;
     DataModule2.ADOQuery1_630.open;
 

но я получаю сообщение об ошибке :

оператор синтаксической ошибки отсутствует в случае выражения, когда месяц(DATE_PAI)=1, затем сумма(MT) еще 0 заканчивается

кто-нибудь может мне помочь, пожалуйста

Комментарии:

1. Я бы попробовал SUM(case when month(DATE_PAI) = 1 then MT else 0 end) AS m .

2. я сделал это, но, возможно, то же самое сообщение об ошибке, потому что оператор case не будет работать в adoquery sql

3. Не имеет ничего общего с ADO — исправьте запрос к используемой вами базе данных. Большинство требует, чтобы вы использовали агрегатную функцию (здесь это СУММА) для результата ДЕЛА, не входящего в его ветви. И комментарий, и ответ делают это правильно.

4. спасибо за ваш комментарий, Брайан, но когда я использую сумму без указания случая, как это :DataModule2. ADOQuery1_630.sql.Add(«ВЫБЕРИТЕ СТАТУС, сумма(MT) КАК m ИЗ VERST630»); это работает

5. ADO по большей части просто передает запрос в базу данных для выполнения. Вам нужно написать действительный SQL для этой базы данных. Delphi не имеет значения, ADO не имеет значения — вам нужно написать правильный запрос для используемой вами базы данных. Текущий ответ содержит допустимый sql для большинства баз данных.

Ответ №1:

Попробуйте сделать :

(группа SELECT и FROM в одном и том же DataModule2.ADOQuery1_630.sql.Add() )

 DataModule2.ADOQuery1_630.sql.clear;
DataModule2.ADOQuery1_630.sql.Add('SELECT STATUT, SUM(case when month(DATE_PAI)=1 then MT ELSE 0 END) AS m FROM table');
DataModule2.ADOQuery1_630.sql.Add('WHERE STATUT in(:dd,:df) and TYPE_QUIT=:l');
DataModule2.ADOQuery1_630.sql.Add('GROUP BY STATUT');
//...
 

Комментарии:

1. я сделал это » (выбор группы и ИЗ в одном и том же модуле данных 2. ADOQuery1_630.sql.Add())’ но то же сообщение об ошибке