【问题标题】:Redshift division result does not include decimals红移除法结果不包括小数
【发布时间】:2018-11-02 19:19:59
【问题描述】:

我正在尝试做一些非常基本的事情来计算 Redshift 中两列之间的百分比。但是,当我使用示例运行查询时,结果只是零,因为没有覆盖小数。

代码:

select 1701 / 84936;

输出:

我试过了:

select cast(1701 / 84936 as numeric (10,10));

但结果是0.0000000000

我怎么能解决这个愚蠢的事情?

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    是整数除法。确保至少有一个参数是:NUMERIC(准确数据类型)/FLOAT(注意:它是近似数据类型):

    /除法(整数除法截断结果)

    select 1701.0 / 84936;
    -- or
    SELECT 1.0 * 1701 / 84936;
    -- or
    SELECT CAST(1701 AS NUMERIC(10,4))/84936;
    

    DBFiddle Demo

    【讨论】:

    • 如果您删除对FLOAT 的引用,那么我会投票赞成 ;) 任何提出这个问题的人都不需要指向浮点运算的毒蛇巢穴......
    • 老兄,非常感谢我来自 SQL 学校,那么这里的很多事情都有些不同。我知道这很愚蠢。
    • @MatBailie 是的,你说得对,浮动可能很危险。例如:stackoverflow.com/questions/33322778/avg-of-float-inconsistency
    【解决方案2】:

    当混合数据类型时,顺序很重要

    请注意,数学表达式中元素的顺序取决于结果的数据类型。
    假设我们打算计算unit_sales/total_sales 的百分比,其中两列(或数字)都是整数。

    查看并尝试使用此代码here

    -- Some dummy table
    drop table if exists sales;
    create table sales as 
        select 3 as unit_sales, 9 as total_sales;
    
    -- The calculations
    select
        unit_sales/total_sales*100,   --> 0 (integer)
        unit_sales/total_sales*100.0, --> 0.0 (float)
        100.0*unit_sales/total_sales  --> 33.3 (float and expected result)
    from sales;
    

    输出

      0 | 0.0 | 33.33
    
    1. 第一列是 0(整数),因为 3/9=0 在整数除法中。
    2. 第二列是 0.0,因为 SQL 首先得到整数 0 (3/9),然后 SQL 将其转换为浮点数以执行乘以 100.0。
    3. 预期的结果。
      表达式开头的非整数 100.0 强制进行非整数计算。

    【讨论】:

    • 这是解决这个问题的一种更简洁的方法 imo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2021-04-24
    • 2015-12-16
    相关资源
    最近更新 更多