2017-11-04 9 views
1
WITH CTE AS 
(
    SELECT 
     ITM.CODE AS ITMCODE, 
     CASE 
      WHEN IOCODE IN (1,2) THEN AMOUNT 
      ELSE AMOUNT * -1 
     END AS AMOUNT 
    FROM 
     ITEMLINE ITL, ITEMS ITM 
    WHERE 
     ITL.ITEMREF = ITM.LOGICALREF 
     AND ITM.CODE = '123' 
) 
SELECT 
    ITMCODE, SUM(AMOUNT) 
FROM 
    CTE 
GROUP BY 
    ITMCODE 

CTEから返される行は5行あり、金額はfloatです。 Sum関数は2,27373675443232E-13を返します。 Amount * -1を使用しない場合は問題ありません。戻り値は正常です。この原因は何ですか?これはビューから返され、私はそれが禁止されているビューを変更することはできません、私は値を修正する必要があります。 5行が5,6,7,8,9であるという値。ありがとう。T-Sql合計正と負の浮動小数点値

+0

[悪い習慣をキックする:使用して古いスタイルなJOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick -using-old-style-joins.aspx) - 古いスタイル*カンマで区切られたテーブル*スタイルのリストが、*適切な* ANSI 'JOIN'構文に置き換えられました。 ANSI - ** 92 ** SQL標準(** 25年前**)とその使用はお勧めしません –

答えて

0

まず、クエリが複雑すぎます。ただしてください:

SELECT ITM.CODE AS ITMCODE, 
     SUM(CASE WHEN IOCODE IN (1, 2) THEN AMOUNT ELSE AMOUNT * -1 
      END) AS AMOUNT 
FROM ITEMLINE ITL JOIN 
    ITEMS ITM 
    ON ITL.ITEMREF = ITM.LOGICALREF 
WHERE ITM.CODE = '123' 
GROUP BY ITM.CODE; 

第2に、これは浮動小数点数の性質です。金額はdecimal/numeric、固定小数点数として保存する必要があります。

あなたは適切な型に変換することによって、あなたが欲しいものを得ることができる必要があります:

SELECT ITM.CODE AS ITMCODE, 
     CONVERT(DECIMAL(10, 2), -- or whatever 
       SUM(CASE WHEN IOCODE IN (1, 2) THEN AMOUNT ELSE AMOUNT * -1 
        END) 
      ) AS AMOUNT 
FROM ITEMLINE ITL JOIN 
    ITEMS ITM 
    ON ITL.ITEMREF = ITM.LOGICALREF 
WHERE ITM.CODE = '123' 
GROUP BY ITM.CODE; 

しかし、私はあなたが金銭のために、より適切な方法で、金額を保存するために、テーブル内のデータを修正することをお勧めしますその金額、:

alter table itemline alter column amount decimal(12, 4); -- or whatever 
+0

問題はクエリに関するものではありません。クエリは単なる例です。私が行をmanuelに更新するとき、ITEMLINE SET UPDATE SET = 5、REF = 1、UPEATE ITEMLINE SET AMOUNT = 6 WHERE REF = 2 ..問題はありません。値に問題があります。私はそれらを修正する必要があります。 – Ozgur

関連する問題