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

Verwendung TSQLQuery von dbExpress-Bibliothek.Wie bekomme ich den korrekten Datentyp des Aggregatefeldes?

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)); 

Als Ergebnis erhalte ich:

Ausnahmeklasse EDatabaseError mit der Meldung 'nicht Feld zugreifen kann 'COLUMN0' als Typ Float'.

Aber wenn ich versuche, Wert als String, gibt es keinen Fehler. Es funktioniert:

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

Wie Daten in Float bekommen?

+0

Siehe diese Frage https://stackoverflow.com/questions/32814875/how-in-delphi-can-i-force-an-sqlite-aggregate-field-to-be-a-numeric-field Sie könnten casten .. –

+0

@JohnEasley Ich habe versucht, alle Varianten 'Select Cast (Summe (Betrag) als float) aus Table1 ...', 'wählen Sie Summe (Betrag) * 1.0 aus Table1 ...' und so weiter, aber habe denselben Fehler – HeathRow

+0

Seltsam, dass der Fehler Spalte0 referenziert, wenn Sie Spalte1 verwenden. Haben Sie versucht, 'SELECT OrderNumber, sum (Amount) FROM Tabelle1 Group by OrderNumber' so zu wählen, dass beide Spalten in der Ergebnismenge sind? –

Antwort

0

ich gezwungen war, diese Lösung zu verwenden:

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; 

Aber wenn jemand einen besseren Weg kennt, werde ich froh sein, wenn man es teilt.

Verwandte Themen