Oracle 分组排序聚合之group by

一个人显示一行记录,一次性待遇和定期待遇在同一行。

发来一个查询语句如下,很长。别吓坏了,用的东西不多,实质就是 分组,聚合

SELECT C.*, (C.AAE019OLD + C.AAE019CE) AAE019NEW
  FROM (SELECT T.AAZ257,
               T.AAC001,
               T.AAB001,
               T.AAC147,
               T.AAC003,
               T.AAC004,
               T.AAC012,
               T.AAA027,
               T.AAC006,
               T.AAC007,
               T.AAC055,
               T.AIC162,
               T.AIC161,
               T.AAC020,
               T.BIC215,
               T.AAE200,
               T.AAE210,
               T.AAC081,
               T.AAC085,
               T.AAC064,
               T.AAC014,
               T.AAC015,
               (SELECT SUM(A.AAE019)
                  FROM AC61 A, AA17 B
                 WHERE A.AAA036 = B.AAA036
                   AND A.AAZ257 = T.AAZ257
                   AND B.BAZ057 = 100000
                   AND A.AAE041 <=
                       (CASE WHEN T.AAE210 > 201701 THEN T.AAE210 ELSE 201701 END)
                   AND A.AAE042 >=
                       (CASE WHEN T.AAE210 > 201701 THEN T.AAE210 ELSE 201701 END)) AAE019OLD,
               decode(t.dqflag, '1', SUM(T.AAE188)) AAE019CE,
               decode(t.dqflag, '0', SUM(T.AAE188)) aae019ycxce
          FROM T_YLZCTZ T
         WHERE T.BIC226 = 1000000000000463
         GROUP BY T.AAZ257,
                  T.AAC001,
                  T.AAB001,
                  T.AAC147,
                  T.AAC003,
                  T.AAC004,
                  T.AAC012,
                  T.AAA027,
                  T.AAC006,
                  T.AAC007,
                  T.AAC055,
                  T.AIC162,
                  T.AIC161,
                  T.AAC020,
                  T.BIC215,
                  T.AAE200,
                  T.AAE210,
                  T.AAC081,
                  T.AAC085,
                  T.AAC064,
                  T.AAC014,
                  T.AAC015,
                  t.dqflag) C

 关键点:

decode(t.dqflag, '1', SUM(T.AAE188)) AAE019CE,

group by 语句除了 group by后面跟的项目,其它出现在查询中的项都必须是聚合函数。

去掉 group by 后的 t.dqflag ,

查询变为 sum((case when t.dqflag='1' then 0 else t.aae188 end)) AAE019CE,

当定期时 只对非1 的进行sum  

当非定期时 只对非0的进行sum。

猜你喜欢

转载自yhzhangdota.iteye.com/blog/2384214