2017-10-10 51 views
0

我有作为SQL查询的一部分的Sql返回0,其中一个比预期

SELECT 
    TransID, 
    SUM(isSatisfactory) as SatTr, 
    count(AllTrades.AllTradeIndex) as AllTr, 
    (SUM(isSatisfactory)/count(AllTrades.AllTradeIndex)) * 100 as RatioOf 

    FROM 
     ...Several subqueries here... 
    GROUP BY TransID 

的结果是

strTransID SatTr AllTr RatioOfGoodAccounts 
307319906 6  12  0 

如果我选择没有组和数学的列,这是结果设置

strTransID isSatisfactory AllTradeIndex 
    307319906 NULL   1334036 
    307319906 NULL   1334037 
    307319906 NULL   1334038 
    307319906 NULL   1334039 
    307319906 NULL   1334040 
    307319906 1    1334041 
    307319906 NULL   1334042 
    307319906 1    1334043 
    307319906 1    1334044 
    307319906 1    1334045 
    307319906 1    1334046 
    307319906 1    1334047 

我想也许是空搞乱它,但我想聚结,并没有影响结果。

+1

整数运算。如果数据类型是整数(无小数),则在SQL服务器中将'(SUM(isSatisfactory)/ count(emplodes.AllTradeIndex))'改为'(SUM(isSatisfactory * 1.0)/ count然后评估结果也是整数(无小数)来解决,将数据类型转换为所需长度的十进制或乘以小数,以便引擎知道在结果中包含小数。 [文档显示这是预期](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/divide-transact-sql) – xQbert

+0

@xQbert是的,这是我的问题是。 –

回答

0

你的提名者和分母都是整数,所以你正在执行integer division,在这种情况下只留下“整个”部分,即0

您可以使用浮点除法,通过将提名显式转换为浮点类型。或者甚至更简单,因为无论如何你都会乘以数字文字,只需使用浮点文字即可。但请注意,它必须使用以前师,后吧:

(SUM(isSatisfactory) * 100.0/COUNT(AllTrades.AllTradeIndex)) AS RatioOf 
-- Here ---------------^ 
相关问题