灾后的重建工作是长期的,需要我们投入更大的激情、耐心和勇气

无意之中,一个困惑了N久的问题找到了

上一篇 / 下一篇  2008-05-05 16:51:20 / 个人分类:工作篇

先看一个语句
&]^DB D0我想查一个客户时间段内每个分类的数量和金额,并且按总量统计ITPUB个人空间w4GB y{.n*Y
SELECT B.CODE_ID,SUM(A.SAL_AMT) SAL_AMT,SUM(A.SAL_MNY) SAL_MNYITPUB个人空间V#yfx*P {@f._
FROM SALE_CUST_PROD_MONTH A, (SELECT A.PROD_CODE,A.PROD_NAME,B.CODE_ID,B.CODE_NAME FROM BAS_PROD_INFO A,
q"W$vS0I\0W.|AZ#A0(SELECT CODE_ID,CODE_NAME FROM BAS_TYPE_CODE WHERE TYPE_CODE = 'PROD_SORT') BITPUB个人空间q9k+qCV},gX {V B
WHERE A.PROD_SORT = B.CODE_ID) B WHERE A.COMP_CODE = '11640101'ITPUB个人空间gD]Wl"b
AND OPER_MONTH >= '200801' AND OPER_MONTH <= '200802' AND A.PROD_CODE = B.PROD_CODE
ya ]#d%C6D?Ui0AND A.CUST_CODE = '640101006250'ITPUB个人空间 \Z0{,|0OQ
GROUP BY GROUPING SETS((B.CODE_ID),1);

CODE_ID SAL_AMT SAL_MNY
h1SU-^J011   33   9042
%H ^?M4DV015   24   858ITPUB个人空间2D}m&U _d&B
13   51   4053ITPUB个人空间6}[iP6E4i'?
12   18   2193ITPUB个人空间P#K_#@0a3a
21   17   328.5ITPUB个人空间 AiJ(Xw qP
14   46   2089.5ITPUB个人空间 \Bt.y(YU5r_A
20   6    162
#@K3A x'?0null  195   18726ITPUB个人空间5_G8MRM Ix
(null 是为了说明方便加上的,真实的数据为空)

GROUPING SETS 是一个很强大的分组函数,可以实现包括rollup,cube 这些分组函数功能,这里的(B.CODE_ID)表示按 CODE_ID 分组,1 表示显示汇总量。

接下来,我需要根据传入的参数,对数量和金额进行一个转换(比如金额显示成万元,数量显示成箱)
@/h} pL5u0SELECT B.CODE_ID,SUM(A.SAL_AMT)*0.2 SAL_AMT,SUM(A.SAL_MNY)/10000 SAL_MNYITPUB个人空间|:Jjy.zl
FROM SALE_CUST_PROD_MONTH A, (SELECT A.PROD_CODE,A.PROD_NAME,B.CODE_ID,B.CODE_NAME FROM BAS_PROD_INFO A,ITPUB个人空间(e+u4Rlp/sY
(SELECT CODE_ID,CODE_NAME FROM BAS_TYPE_CODE WHERE TYPE_CODE = 'PROD_SORT') B
k$b$Yy(U+}0WHERE A.PROD_SORT = B.CODE_ID) B WHERE A.COMP_CODE = '11640101'ITPUB个人空间zx"Z5Pu
AND OPER_MONTH >= '200801' AND OPER_MONTH <= '200802' AND A.PROD_CODE = B.PROD_CODE
`yt&m:GRs9]q4f.f _0AND A.CUST_CODE = '640101006250'
1I}J6C0e0GROUP BY GROUPING SETS((B.CODE_ID),1);

CODE_ID SAL_AMT SAL_MNY
X%~0OU tN0@%bW9b[011    6.6   0.9042
im:WcO?3p;VD |015    4.8   0.0858ITPUB个人空间I IB+_(H8l#o
13    10.2  0.4053
D0?:R.Uz012    3.6   0.2193
4P#{(` lA.gX021    3.4   0.03285ITPUB个人空间`,a2~sG2`Q,E
14    9.2   0.20895
7N2t/fpLK q"N3nl V020    1.2   0.0162
z S_)eF:n6I0null   39   1.8726
O6~Zju2w;m W3s0这样也没错

可是,当语句变成
P1|Q/e8r0SELECT B.CODE_ID,SUM(A.SAL_AMT)*1 SAL_AMT,SUM(A.SAL_MNY)/1 SAL_MNY
nl'}+BiY$_5t(I0FROM SALE_CUST_PROD_MONTH A, (SELECT A.PROD_CODE,A.PROD_NAME,B.CODE_ID,B.CODE_NAME FROM BAS_PROD_INFO A,
I_1bhrR4N0(SELECT CODE_ID,CODE_NAME FROM BAS_TYPE_CODE WHERE TYPE_CODE = 'PROD_SORT') BITPUB个人空间LD[$Z~}&j/g oZ
WHERE A.PROD_SORT = B.CODE_ID) B WHERE A.COMP_CODE = '11640101'ITPUB个人空间$cPB4CO8[
AND OPER_MONTH >= '200801' AND OPER_MONTH <= '200802' AND A.PROD_CODE = B.PROD_CODEITPUB个人空间` ssm UnA Hy
AND A.CUST_CODE = '640101006250'
3IO+H0g*c0GROUP BY GROUPING SETS((B.CODE_ID),1);ITPUB个人空间.kig$X w1b%hJ
即想显示原来的单位时,问题来了

CODE_ID SAL_AMT SAL_MNYITPUB个人空间-C!k r'| c2K
13   null  null 
z-a#b7N@021   null  null 
$R7g(bz&H!@4\ v011   null  null 
_+E,_Q%^"b F`*r)]012   null  null ITPUB个人空间'}dcUgC^*LJ(dJ
20   null  null ITPUB个人空间\O5}3^&| JpJ'?
14   null  null 
`_6cl9Mw'f o015   null  null ITPUB个人空间'VKW"uE)E ~&F
null  195   18726

除了合计,数量和金额都变成空值了,将数据计算移到括弧里面,却又正常了

SELECT B.CODE_ID,SUM(A.SAL_AMT*1) SAL_AMT,SUM(A.SAL_MNY/1) SAL_MNY
3bqvRTT0FROM SALE_CUST_PROD_MONTH A, (SELECT A.PROD_CODE,A.PROD_NAME,B.CODE_ID,B.CODE_NAME FROM BAS_PROD_INFO A,
.\Ez+YFz'Pb F0(SELECT CODE_ID,CODE_NAME FROM BAS_TYPE_CODE WHERE TYPE_CODE = 'PROD_SORT') BITPUB个人空间!Ljx'M'hf W RU
WHERE A.PROD_SORT = B.CODE_ID) B WHERE A.COMP_CODE = '11640101'
C%vhnK$|zR0AND OPER_MONTH >= '200801' AND OPER_MONTH <= '200802' AND A.PROD_CODE = B.PROD_CODEITPUB个人空间$@5A.l a-H,}}s#L S
AND A.CUST_CODE = '640101006250'ITPUB个人空间Ins`OE
GROUP BY GROUPING SETS((B.CODE_ID),1);

CODE_ID SAL_AMT SAL_MNY
9k]tVi011   33   9042ITPUB个人空间 i4JU&z @R K
15   24   858ITPUB个人空间Q$A$j"I*i t%Z1M
13   51   4053ITPUB个人空间n6`X K:u,s
12   18   2193
Fi9R pf ^ Ek5} ~021   17   328.5
^|3e D%K%Uu014   46   2089.5ITPUB个人空间XXb~g"i
20   6    162ITPUB个人空间O#{}\"t%Ke
null  195   18726

因为是突然发生的,根本找不到原因,只好改语句,可是后来又有类似的语句发生此类问题,一直无解,只能改语句了事。
e,@V)_;dB7t0今天,突然意识到,会不会就是这个GROUPING SETS 的问题,因为 1 表示汇总,用() 也是一样的效果(官方是推荐用()的)
*u/yU'~N0于是把语句改成
yF0m-h"R0SELECT B.CODE_ID,SUM(A.SAL_AMT)*1 SAL_AMT,SUM(A.SAL_MNY)/1 SAL_MNYITPUB个人空间Yq6E#H^ }S
FROM SALE_CUST_PROD_MONTH A, (SELECT A.PROD_CODE,A.PROD_NAME,B.CODE_ID,B.CODE_NAME FROM BAS_PROD_INFO A,
i9V;MIT0(SELECT CODE_ID,CODE_NAME FROM BAS_TYPE_CODE WHERE TYPE_CODE = 'PROD_SORT') BITPUB个人空间kK$O7R;JD$fwd
WHERE A.PROD_SORT = B.CODE_ID) B WHERE A.COMP_CODE = '11640101'
2B)L%y*xj&y9V us2l0AND OPER_MONTH >= '200801' AND OPER_MONTH <= '200802' AND A.PROD_CODE = B.PROD_CODEITPUB个人空间)a3n3@2V!N&Sx-~
AND A.CUST_CODE = '640101006250'
!B+N.g&e*Y5B!~0N0GROUP BY GROUPING SETS((B.CODE_ID),());

一切变的安静了,数据正常的显示。
0O~5mmup!W0找到了问题的根源,可是,究竟为什么这样呢,还没有确切的解释,不知道是不是oracle的一个bug了。
n0x4kQA-b0记下来,也许以后有答案呢。ITPUB个人空间z7Z6t6J[@


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar