2017-10-24 11 views
1
CREATE TABLE [Table1] (
    [OrderNumber] integer, 
    [Amount] float 
); 

dbExpress 라이브러리의 TSQLQuery을 사용하십시오.agregate 필드의 올바른 데이터 유형을 얻는 방법은 무엇입니까?

SQLQuery1.SQL.Clear; 
    SQLQuery1.SQL.Text := 'select sum(Amount) from Table1 group by OrderNumber'; 
    SQLQuery1.Open; 
    SQLQuery1.First; 
    Memo1.Lines.Add(FloatToStr(SQLQuery1.Fields.FieldByNumber(1).AsFloat)); 

은 결과, 내가 얻을 : 메시지

예외 클래스 EDatabaseError는 'Float 형으로'Column0 '필드에 액세스 할 수 없습니다'.

그러나 내가 String으로 값을 얻으 려한다면 오류가 없습니다. 그것은 작동 :

Memo1.Lines.Add(SQLQuery1.Fields.FieldByNumber(1).AsString); 

어떻게 Float에서 데이터를 얻을?

+0

이 질문을 참조하십시오 https://stackoverflow.com/questions/32814875/how-in-delphi-can-i-force-an-sqlite-aggregate-field-to-be-a-numeric-field .. –

+0

@ JohnEasley 나는 모든 변종'Table1 ...에서'선택 (합계 (양) float)','합계 (금액) * 1.0 Table1 ...에서 선택 캐스팅을 시도했지만, 같은 오류가있어 – HeathRow

+0

Column1을 사용할 때 오류가 Column0을 참조하는 것이 이상합니다. 두 개의 컬럼이 결과 세트에 있도록'SELECT OrderNumber, sum (Amount) FROM Table1 Group by OrderNumber'을 시도 했습니까? –

답변

0

나는이 솔루션을 사용하도록 강요했다 :

SQLQuery1.SQL.Text := 
    'drop table if exists temp.agregatetable1;  '; 
    SQLQuery1.ExecSQL(False); 
    SQLQuery1.SQL.Text := 
    'create temp table if not exists AgregateTable1 '+ 
    '(            '+ 
    ' [OrderNumber] integer,      '+ 
    ' [SumAmount] float       '+ 
    ');            '; 
    SQLQuery1.ExecSQL(False); 
    SQLQuery1.SQL.Text := 
    'insert into Temp.AgregateTable1    '+ 
    'select           '+ 
    '  OrderNumber,        '+ 
    '  sum(Amount)        '+ 
    'from           '+ 
    '  Table1         '+ 
    'group by          '+ 
    '  OrderNumber;        '; 
    SQLQuery1.ExecSQL(False); 
    SQLQuery1.SQL.Text := 
    'select SumAmount from Temp.AgregateTable1  '; 
    SQLQuery1.Open; 
    SQLQuery1.First; 
    while not SQLQuery1.Eof do 
    begin 
     Memo1.Lines.Add(FloatToStr(SQLQuery1.Fields.FieldByNumber(1).AsFloat)); 
     SQLQuery1.Next; 
    end; 

그러나 사람이 더 좋은 방법을 알고 있다면 당신이 그것을 공유하는 경우, 내가 기쁠 것입니다.