1. 实现的代码和返回数据
SELECT nvl(MAX(nvl(smcrealcount,0)),0),
nvl(  MAX(decode(nvl(smcrealcount,0),0,NULL,smcrealcount))  ,0) FROM test WHERE begintime=to_date('2009-08-31','yyyy-mm-dd')
--1 134982 668402. 不取最大值时的数据情况
SELECT nvl(smcrealcount,0),
 decode(nvl(smcrealcount,0),0,NULL,smcrealcount)
 FROM test
WHERE begintime=to_date('2009-08-31','yyyy-mm-dd')
1 0
2 0
3 0
4 0
5 134982 134982
6 0
7 0
8 0
9 0
10 66840 66840
11 0
12 0
13 0
14 66402 66402
15 0
16 0
17 0
18 0
19 66744 667443. 取最大值的情况
SELECT max(nvl(smcrealcount,0)),
 max(decode(nvl(smcrealcount,0),0,NULL,smcrealcount))
 FROM test
WHERE begintime=to_date('2009-08-31','yyyy-mm-dd')
--1 134982 66840

解决方案 »

  1.   

    问题出在这里
    nvl(  MAX(decode(nvl(smcrealcount,0),0,NULL,smcrealcount))  ,0)decode 的时候,smcrealcount值为0的输出null
    不为0的,输出smcrealcount
    输出的smcrealcount类型要与null保持一致
    系统将这个类型认为是字符型
    smcrealcount被转换成字符型了,因此最大的是以6开头的那个数
    你在decode 外围加个to_number试试
    会得到不同的结果
      

  2.   

    被你发现了。。赫赫,decode返回字符型
      

  3.   

    把null改成0也是正确的。
    select max(decode(nvl(smcrealcount,0),0,0,smcrealcount)) from test;