2016-08-17 2 views
0

Ich habe ein wirklich seltsames Problem mit dieser Case-Anweisung und Formel, wo ich 0 für diese Division Formel bekommen, obwohl, wenn ich jede Anweisung unabhängig ausführen, bekomme ich die richtige Nummer. Wenn ich die zweite selet-Anweisung lösche und sogar die Zahl eingäbe, bekomme ich immer noch null. Die Zahlen kommen auf 167913/1150972, wenn ich die zweite Zahl auf 1150 trenne, funktioniert es, aber wenn ich die 9 addiere, bekomme ich 0 zurück.Formel in Case-Anweisung Null

CASE WHEN 
     ISNULL(MAX(JC.JOB_SHIPPED_FLAG), MAX(OE10.ORD_SHIPPED_FLAG)) = 'P' AND ISNULL(MAX(JC.JOB_STATUS_FLAG), MAX(OE10.ORD_STATUS_FLAG)) = 2 
      THEN (SELECT SUM(CAST(TOT_COST AS INT)) FROM CRCDATA.DBO.LA15 
        WHERE EST_NUMB = MAX(JC.EST_NUMB) AND LA15.QTY_SLOT =1) 
        /
        ((SELECT DISTINCT SUM(CAST(FG14.ONHAND_QTY AS INT)) FROM CRCDATA.DBO.JC11 JC11 
         LEFT OUTER JOIN CRCDATA.DBO.FG14 FG14 ON JC11.FG_ITEM_NUMB = FG14.ITEM_NUMB 
          WHERE JC11.FG_ITEM_NUMB LIKE '0000000%' AND JC11.STATUS_FLAG = 'P' AND FG14.LOC <> 'rej') + 
      (SELECT SUM(CAST(SHIPTO_FAX AS INT)) FROM CRCDATA.DBO.SH10 WHERE RECORD_TYPE = 'B' AND PROCESS_FLAG = 4 AND SH10.JOB_NUMB = A.JobNumber)) 


     ELSE 0 
     END [TEST] 
+0

sind Sie ein int Rückkehr? '167913/1150972' evals zu' 0.14588 ... 'das würde auf ganzzahlige 0 abrunden –

+0

Ist das die ganze Aussage oder nur ein Teil einer größeren Abfrage? Welches DBMS? (Einige nicht-ANSI SQL dort ...) – jarlh

+0

@jarlh es ist Teil einer größeren Abfrage. Es ist mssql sowie –

Antwort

1

Sie müssen einen der Dividierer oder Dividende in FLOAT umwandeln. das heißt

SELECT CAST(val1 AS FLOAT)/val2 

ODER

SELECT val1/CAST(val2 AS FLOAT) 
+0

Das hat funktioniert. Normalerweise benutze ich Geld, wenn das Casting immer abgerundet wird? –

+0

Ja, Casting Int immer abgerundet. Sie können sich selbst überprüfen, indem Sie float-Werte nach int übergeben. – aadi

0

Fügen Sie einfach "+.0" zu einer Ihrer Werte

Zum Beispiel

Select 5/20  Return 0 
Select 5/(20+.0) Return 0.2500000