2017-10-12 5 views
0

Früher zeigte die Ergebnismenge 300,00, wenn es wie folgt war, wo die Zugabe aus zwei verschiedenen Tabellenkolumnen stattfindet.Dezimal Division Präzision

Cast((SELECT Cost FROM Table1 WHERE Id = CD.Id) + 
     (SELECT RecuritmentCost FROM Table2 WHERE Id = CD.Id) 
AS VARCHAR(10)) 

Aber ich habe eine gewisse Anforderung bekam eine Divisionsoperation in einem Fall so im Fall Aussage ich verwende, unter dem tun wird, was in 300,0000000000000

cast((((
    SELECT Cost 
    FROM Table1 
    WHERE Id = CD.Id 
    ) + (
    SELECT RecuritmentCost 
    FROM Table2 
    WHERE Id = CD.Id 
    ))/(Select Count(*) from tblEmployee where Id = CD.Id and emptype=2)) AS VARCHAR(18)) 

hier habe ich verwendet varchar (18) weil es Fehler geworfen hat, wenn ich varchar (10) verwende

Fehler war "arithmetischer Überlauffehler, der numerisch zum Datentyp varchar umwandelt".

von varchar (18) verwendet wurde, wurde dieser Fehler entfernt, aber zur Folge beginnen 300,0000000000000

Die colums zeigt, auf der Operationen stattfinden, sind vom Typ

Cost(decimal(18,2),null) 
RecuritmentCost(decimal(18,2), null) 

Ich glaube, ich nicht die Dinge bin Umwandlung richtig, aber eigentlich brauche ich Ergebnis in einer Zeichenfolge, so verwende ich Cast als Varchar(18). Können wir dieses Problem lösen, wenn irgendeine Operation unter diese zwei Spalten stattfindet, sollte es Ergebnis in zwei Dezimalstellen und das auch im Zeichenfolgenformat zurückgeben.

Antwort

1

Wenn Sie zum ersten Mal Werte mit unterschiedlichen Datentypen arithmetisch berechnen, wählt SQL Server die besten Datentypen für das Ergebnis. Ihre Abfrage fügt 2 Dezimalwerte hinzu und dividiert durch eine Ganzzahl (count(*)). Sie werfen es dann auf varchar. Die Division des Ergebnisses der Unterabfrage führt dazu, dass die Ergebnisse den Typ ändern.

Ich bin mir nicht sicher, warum Sie die Besetzung zu varchar, wenn Sie einfach das Ergebnis an decimal(18,2) um die Präzision zu halten casten können. Wenn Sie das tun, den Wert als varchar benötigen, dann muss er in decimal(18,2) zuerst dann zu varchar:

Führen Sie die folgenden Tests:

DECLARE @decimalValue DECIMAL(18, 2) = 300.00; 

SELECT @decimalValue; 
-- 300.00 

SELECT CAST(@decimalValue + @decimalValue 
      /(SELECT 3) AS VARCHAR(18)) AS ResultOriginal; 
-- 400.0000000000000 

SELECT CAST(@decimalValue + @decimalValue 
      /(SELECT 3) AS DECIMAL(18,2)) AS ResultAsDecimal; 
-- 400.00 

SELECT CAST(CAST(@decimalValue + @decimalValue 
      /(SELECT 3) AS DECIMAL(18,2)) AS VARCHAR(18)) AS ResultAsVarchar; 
-- 400.00 
Verwandte Themen