【问题标题】:Why is my Percentage 0 when run on SQL Server?为什么在 SQL Server 上运行时我的百分比为 0?
【发布时间】:2015-09-15 16:25:18
【问题描述】:

我正在构建以下 Oracle SQL 查询。我试图获得在 2 个日期之间销售最多国际付款的销售人员。

我有以下查询

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,这是怎么来的?

【问题讨论】:

  • 可以考虑使用 ratio_to_report 解析函数。
  • 将两个计数添加为单独的字段,以确保除数不会太大以至于百分比小于 0.01%
  • 预期百分比是 33.33 和 66.66,所以我认为这不能解决问题。
  • 您是在问为什么该语句适用于 Oracle 而不适用于 SQL Server?

标签: sql sql-server oracle


【解决方案1】:

更新

造成差异的原因是Oracle的INTEGER本质上是NUMBER(38,0)的别名。有一个相关的 SO 问题here。两个整数相除实际上是小数除法,所以 1/2 会返回 0.5

另一方面,SQL Server 有几种整数类型(smallint、tinyint、int、),整数除法执行整数除法。 1/2 将返回 0

原创

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

您应该在除法之前将至少一个操作数转换为浮点数/十进制数。这就像将 红利 乘以 100.0 一样简单,例如:

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

【讨论】:

  • 这是不正确的 - SQLFIDDLE 给出了一个包含两个整数列 (NUMBER(1,0)) 的表的示例,除法的结果是小数。
  • @MT0 我在问题仍被标记为sql-server时回复了。
  • @Guil what 你想做什么?在两个数据库上运行相同的查询?在 SQL Server 整数除法中返回一个整数。正如 MT0 指出的那样,oracle 返回一个小数,原始查询应该可以工作
  • 所以你是说我的查询与 SQL Server 不兼容?
  • 如果您尝试在两个数据库中使用相同的查询,这不是不兼容,只是整数除法的工作方式不同 - 或者更确切地说,Oracle 没有整数 和整数除法,它有NUMBER 0 刻度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多