select a.ta021*1.0000*d.de1/d.de2*(1.0000+d.de3/100.0000-d.de4/100.0000) as sumquan
from Cmocta a left join cbom c on a.cinvcode = c.cinvcode left join cbomson d on c.bomid=d.bomid 
left join ainventory b on d.cinvcode=b.cinvcode
where a.ta003 between @socode1 and @socode2  AND a.lay = @Level-1
以上代码,当a.ta021 为 decimal(18,4) 的时候,sumquan 的值为 38.0000, 当a.ta021 为 float 的时候,sumquan 的值为 37.9011 
现在问题是 a.ta021 一定是 decimal(18,4) , 但又想值为37.9011 , SQL语句怎么写呢

解决方案 »

  1.   

    其实 SQL 全部如下select a.ta001,a.ta002,d.cinvcode,case b.ifint when 0 then a.ta021*1.0000*d.de1/d.de2*(1.0000+d.de3/100.0000-d.de4/100.0000) 
    when 1 then ceiling(a.ta021*1.0000*d.de1/d.de2*(1.0000+d.de3/100.0000-d.de4/100.0000)) end as sumquan,
    a.ta003,a.lay
    from Cmocta a left join cbom c on a.cinvcode = c.cinvcode left join cbomson d on c.bomid=d.bomid 
    left join ainventory b on d.cinvcode=b.cinvcode
    where a.ta003 between 'G1204-0001' and 'G1204-0001' 
    如果没有case,倒还是会显示小数的,如果加了case就自动取整了,好奇怪.
      

  2.   

    select b.ifint,case b.ifint when 0 then a.ta021*1.0000*d.de1/d.de2*(1.0000+d.de3/100.0000-d.de4/100.0000) 
     end as sumquan
    from Cmocta a left join cbom c on a.cinvcode = c.cinvcode left join cbomson d on c.bomid=d.bomid 
    left join ainventory b on d.cinvcode=b.cinvcode
    where a.ta003 between 'G1204-0001' and 'G1204-0001' 如上写法也是有小数的.
    只是多加了一个判断,就全部取整了.
      

  3.   

    select b.ifint,case b.ifint when 0 then a.ta021*1.0000*d.de1/d.de2*(1.0000+d.de3/100.0000-d.de4/100.0000) 
     when 1 then ceiling(2) end as sumquan
    from Cmocta a left join cbom c on a.cinvcode = c.cinvcode left join cbomson d on c.bomid=d.bomid 
    left join ainventory b on d.cinvcode=b.cinvcode
    where a.ta003 between 'G1204-0001' and 'G1204-0001' 
    以上写法,也有小数
      

  4.   

    ceiling 这个函数引起的同一个字段显示整数和小数,需要转为字符类型
      

  5.   

    CEILING函数用于返回大于或等于指定表达式的最小整数
      

  6.   

    只是ceiling只是case when 一种可能性,但是现在变得两种可能 都使用了ceiling 函数, 好像不符合case when的逻辑呢
      

  7.   

    看看是否为这样?
    select a.ta001,
    a.ta002,
    d.cinvcode,
    case b.ifint when 0 then LTRIM(STR(a.ta021*1.0000*d.de1/d.de2*(1.0000+d.de3/100.0000-d.de4/100.0000),18,4)  )
     when 1 then ltrim(ceiling(a.ta021*1.0000*d.de1/d.de2*(1.0000+d.de3/100.0000-d.de4/100.0000))) end as sumquan,
     a.ta003,a.lay
     from Cmocta a left join cbom c on a.cinvcode = c.cinvcode left join cbomson d on c.bomid=d.bomid  
    left join ainventory b on d.cinvcode=b.cinvcode
     where a.ta003 between 'G1204-0001' and 'G1204-0001' 
      

  8.   

    可以了,只是不太明白ltrim函数,在我的印象中,不过是删掉左边的空格呀,
      

  9.   

    知道ltrim的作用了,只是对于为什么要用在ceiling上呢,难道ceiling会产生空格么