2015-09-15 32 views
-1

我正在构建Oracle SQL query.I尝试获得在两个日期之间销售最多国际支付的推销员。为什么我的百分比0在SQL Server上运行?

我有以下查询

SELECT ddo.CODE as "Salesman ID", ROUND((count(fpp.ID)/
    (SELECT count(fpp2.ID) 
    FROM Payments_Table fpp2 
     JOIN Clients_Table da2 ON fpp2.Client_ID = da2.ID 
     JOIN Currency_Table dc2 ON dc2.ID = fpp2.CURRENCY_ID 
    WHERE dc2.CURRENCY_CODE != da2.CURRENCY 
    ) * 100), 2) AS "% Different currency" 
FROM Salesmen_Table ddo 
    JOIN Payments_Table fpp ON ddo.ID = fpp.DATA_OWNER_ID 
    JOIN Clients_Table da ON fpp.ORDERING_ACCOUNT_ID = da.ID 
    JOIN Currency_Table dc ON fpp.CURRENCY_ID = dc.ID 
WHERE da.CURRENCY != dc.CURRENCY_CODE 
GROUP BY ddo.CODE 

应该给一个递减名单,根据国际收支的百分比。像下面这样:

  • 推销员ID%不同的货币
  • 杰克66.66
  • 约翰33.33

我有我的数据库3金,2杰克和1约翰,所以这是我期望的结果。但是我的%的结果是0.这是怎么回事?

+0

你可以考虑使用RATIO_TO_REPORT解析函数。 – user2672165

+0

将两个计数作为单独的字段添加,以确保除数不是很大,以至于百分比小于0.01% –

+0

预期百分比是33.33和66.66,所以我不认为这解决了问题。 – Jonas

回答

2

UPDATE

的差异造成的,因为甲骨文的INTEGER本质上是NUMBER(38,0)的别名。有一个相关的SO问题here。除了两个整数实际上执行十进制除法,因此1/2将返回0.5。另一方面,SQL Server有几个整数类型(smallint,tinyint,int),除法整数执行整数除法。 1/2将返回0

ORIGINAL

你将整数。在整数除法中,结果本身就是一个整数。这意味着小于100%(即1)的百分比值变为0.

您应该在划分之前将至少一个操作数转换为浮点/小数。这是由100.0分红倍增,例如简单:

ROUND((100.0*count(fpp.ID))/... 
+0

这是不正确的 - [SQLFIDDLE](http://sqlfiddle.com/#!4/529a2/1/0)给出了一个带有两个整数列('NUMBER(1,0)')的表的例子,除法结果是小数点。 – MT0

+1

@ MT0我回答说问题仍然被标记为'sql-server'。 –

+0

此查询适用于Oracle和SQL Server – Jonas