3

SQL Server2008R2データベースに次のテーブル構造があります。

  CREATE TABLE FormTest
(   
clientid char(10),
DateSelected date,
A int,
B int,
C int
)

表FormTestに次の情報を入力しました

clientid        DateSelected      A       B     C
x1              2006-06-09     65150    4921    1
x2              2006-05-05     155926   69092   1
x3              2006-01-20     95603    156892  1
x4              2006-01-20     30704    164741  1
x4              2006-02-03     65150    174834  1
x5              2006-04-28     59629    4921    1
x6              2006-01-27     30704    162356  1
x7              2006-06-30     65150    4921    1
x8              2006-07-10     65150    4921    1

そして最後に、このSQLクエリを実行します。

SELECT clientid, (((a+ b + c) / 3) / 216647 * 10) AS Formula1 
    From FormTest

しかし、私はこれらの結果を得ました:

clientid        Formula1      
x1              0
x2              0
x3              0
x4              0
x4              0
x5              0
x6              0
x7              0
x8              0

誰かが私が間違っていることを教えてもらえますか?

4

4 に答える 4

4

整数除算をしているからです。次のようなものを使用して、オペランドの1つをfloatまたはdecimal(実行している計算の精度と目的に応じて)に変換する必要があります。

((CAST((a+ b + c) AS FLOAT) / 3) / 216647 * 10)

またはおそらく:

(((a+ b + c) / 3.0) / 216647.0 * 10)
于 2012-06-20T03:41:25.233 に答える
2

整数演算を実行しているため、結果は常に最も近い整数に切り捨てられます。3で除算し、次に216647で除算しているため、数値入力に基づいて、結果は毎回0に切り捨てられます。整数以外の結果を取得する場合は、10進数(正確)または浮動小数点(近似)のデータ型および/またはキャストを使用する必要があります。

于 2012-06-20T03:40:00.040 に答える
0
declare @a int
declare @b int
declare @c int
set @a=65150
set @b=4921
set @c=1

select convert(float,((@a+@b+@c)/ 216647.0 * 10) )
于 2012-06-20T03:42:55.030 に答える
0

整数を除算すると整数になります(余りの部分は無視されます)。したがって、除算するときは、小数または浮動小数点数を使用してください。これは、前述のフロートソリューションに加えて機能するはずです。(12,2)をお好みの精度に置き換えます。

SELECT clientid, (((
Cast(a as decimal(12,2)) + 
Cast(b as decimal(12,2)) + 
Cast(c as decimal(12,2)) 
) / 3) / 216647 * 10) AS Formula1 
FROM FormTest
于 2017-10-31T13:01:04.477 に答える