2012-10-20 37 views
1

我是Oracle Analytics的新手。任何人都可以帮我解决以下问题。Oracle分析函数用法

SELECT year, 
      month, 
      week, 
      C.cpg_pk              CPG, 
      C.dep_pk              DEPT, 
      T.cust_id              CUST_ID, 
      D1.r_id               R_ID, 
      Decode(d2.at_code, '3', func1.Get_att(d2.at_code, D2.val_code)) AS P1, 
      Decode(d2.at_code, '2', func1.Get_att(d2.at_code, D2.val_code)) AS IC, 
      Decode(d2.at_code, '1', func1.Get_att(d2.at_code, D2.val_code)) AS B1, 
      Decode(func1.Get_att(d2.at_code, D2.val_code), 2, d2.at_code) AS P2, 
      Decode(func1.Get_att(d2.at_code, D2.val_code), 5, d2.at_code) AS B2, 
      Count(DISTINCT A.cust_id)          TOTAL_ACC 
      , 
      Count(DISTINCT T.txn_pk) 
      TOTAL_TXN, 
      SUM(am_amount)             TOTAL_AMT 
    FROM t_header T, 
      cust_master A, 
      tx_details1 D1, 
      tx_details2 D2, 
      cpg_master C 
    WHERE A.TYPE = 0 
      AND T.cust_id = A.cust_id 
      AND T.txn_pk = 5001 
      AND T.txn_pk = D1.txn_pk 
      AND T.txn_pk = D2.txn_pk 
      AND D1.cpg_pk = C.cpg_pk 
      AND D1.op = 1 
    GROUP BY year, 
       month, 
       week, 
       C.cpg_pk, 
       C.dep_pk, 
       t.cust_id, 
       D1.r_id, 
       Decode(d2.at_code, '3', func1.Get_att(d2.at_code, D2.val_code)), 
       Decode(d2.at_code, '2', func1.Get_att(d2.at_code, D2.val_code)), 
       Decode(d2.at_code, '1', func1.Get_att(d2.at_code, D2.val_code)), 
       Decode(func1.Get_att(d2.at_code, D2.val_code), 2, d2.at_code), 
       Decode(func1.Get_att(d2.at_code, D2.val_code), 5, d2.at_code) 

其产生的输出如下所示:

YEAR MONTH WEEK CPG DEPT CUST_ID R_ID P1 IC B1 P2 B2 TOTAL 
2012 08  32  127 -1  10019 3665      134 23100.09 
2012 08  32  127 -1  10019 3665      135 23100.09 
2012 08  32  127 -1  10019 3665    723   23100.09 
2012 08  32  127 -1  10019 3665  714    23100.09 
2012 08  32  127 -1  10019 3665     41  23100.09 
2012 08  32  127 -1  10019 3665     42  23100.09 
2012 08  32  127 -1  10019 3665  21     23100.09 
2012 08  32  128 -1  10019 3665      134 23100.09 
2012 08  32  128 -1  10019 3665      135 23100.09 
2012 08  32  128 -1  10019 3665    723   23100.09 
2012 08  32  128 -1  10019 3665  714    23100.09 
2012 08  32  128 -1  10019 3665     41  23100.09 
2012 08  32  128 -1  10019 3665     42  23100.09 
2012 08  32  128 -1  10019 3665  21     23100.09 

这里的值被重复。我试图用group by消除重复,但没有成功。你可以帮帮我吗?

所需的输出是这样的:

YEAR MONTH WEEK CPG DEPT CUST_ID R_ID P1 IC B1 P2 B2 TOTAL_AMT 
--------------------------------------------------------------------------------- 
2012 08  32  127 -1  10019 3665 21 714 723 41 134 23100.09 
2012 08  32  127 -1  10019 3665 21 714 723 41 135 23100.09 
2012 08  32  127 -1  10019 3665 21 714 723 42 134 23100.09 
2012 08  32  127 -1  10019 3665 21 714 723 42 135 23100.09 
2012 08  32  128 -1  10019 3665 21 714 723 41 134 23100.09 
2012 08  32  128 -1  10019 3665 21 714 723 41 135 23100.09 
2012 08  32  128 -1  10019 3665 21 714 723 42 134 23100.09 
2012 08  32  128 -1  10019 3665 21 714 723 42 135 23100.09 

最主要的是yearmonthweekcpgdeptcust_idr_idp1icb1p2b2它应该是唯一的行。使用分析函数可以实现,还是需要编写PL/SQL?我的问题很敏感吗?

+1

可能的重复[我可以在这里使用Oracle分析函数吗?](http://stackoverflow.com/questions/12614209/can-i-use-oracle-analytical-function-here) –

+0

是的,但输出不是给我期望的结果 – user1760970

+1

因此,回答托尼的回答说为什么,并改进原来的问题 - 不要问一个相同的问题。请阅读[FAQ](http://stackoverflow.com/faq)。 –

回答

1

与T1 如( 选择2012 YEAR1,08 MONTH1,32周,127 CPG,-1 DEPT,10019 CUST_ID,3665 R_ID,空P1,空IC,723 B1,空P2,空B2,23100.09 TOTAL来自双联合所有 - 从双联合中选择2012年,08年,32年,127年,-1年,10019年,3665年,空,空,空,空,135,23100.09全部 - select 2012,08,32,127, -1,10019,3665,null,null,null,null,134,23100.09 from double union全部 select 2012,08,32,127,-1,10019,3665,null,714,null,null,null,23100.09来自双重联合的所有 - 从双重联合中选择2012,08,32,127,-1,10019,3665,null,null,null,41,null,23100.09全部 - select 2012,08,32,127, -1,10019,3665,null,n来自双联盟的所有 - 从双联盟中选择2012,08,32,127,-1,10019,3665,21,null,null,null,null,23100.09全部 - 从双重联合中选择2012,08,32,128,-1,10019,3665,null,null,null,134,23100.09全部 - 选择2012,08,32,128,-1,10019,3665, null,null,null,null,135,23100.09 from double union全部 select 2012,08,32,128,-1,10019,3665,null,null,723,null,null,23100.09 from double union全部 select 2012 ,08,32,128,-1,10019,3665,null,714,null,null,null,来自双联合的所有的的23100.09 - 选择2012,08,32,128,-1,10019,3665,null, null,null,41,null,23100.09 from double union全部 - 从d中选择2012,08,32,128,-1,10019,3665,null,null,null,42,null,23100.09联盟全部 - 从双 )中选择2012,08,32,128,-1,10019,3665,21,null,null,null,null,23100.09)选择t1p1.YEAR1,t1p1.month1, ,选择YEAR1,month1,week,t1p1.cpg,t1p1.dept,t1p1.cust_id,t1p1.r_id,t1p1.p1,t1ic.ic,t1b1.b1,t1p2.p2,t1b2.b2,t1p1.total cpg,dept,cust_id,r_id,p1,total from t1其中p1不为空)t1p1, (从t1选择YEAR1,month1,week,cpg,dept,cust_id,r_id,ic,其中ic不为null)t1ic, (从t1选择YEAR1,month1,week,cpg,dept,cust_id,r_id,b1,其中b1不为空)t1b1, (从t1选择YEAR1,month1,week,cpg,dept,cust_id,r_id,p2其中p2是不是null)t1p2, (从t1选择YEAR1,month1,week,cpg,dept,cust_id,r_id,b2,其中b2不为空)t1b2 (+)和t1p1.year1 = t1b1.year1(+)和t1p1.year1 = t1p2.year1(+)和t1p1.year1 = t1b2.year1(+) 和t1p1.month1 = t1ic.month1(+)和t1p1.month1 = t1b1.month1(+)和t1p1.month1 = t1p2.month1(+)和t1p1。month1 = t1b2.month1(+) and t1p1.week = t1ic.week(+)and t1p1.week = t1b1.week(+)and t1p1.week = t1p2.week(+)and t1p1.week = t1b2.week (+) 和t1p1.cpg = t1c.cpg(+)和t1p1.cpg = t1b1.cpg(+)和t1p1.cpg = t1p2.cpg(+)和t1p1.cpg = t1b2.cpg(+) 和t1p1.dept = t1ic.dept(+)和t1p1.dept = t1b1.dept(+)和t1p1.dept = t1p2.dept(+)和t1p1.dept = t1b2.dept(+) 和t1p1.cust_id = t1ic .cust_id(+)和t1p1.cust_id = t1b1.cust_id(+)和t1p1.cust_id = t1p2.cust_id(+)和t1p1.cust_id = t1b2.cust_id(+) 和t1p1.r_id = t1ic.r_id(+)和t1p1.r_id = t1b1.r_id(+)和t1p1.r_id = t1p2.r_id(+)和t1p1.r_id = t1b2.r_id(+) order by t1p1.YEAR1,t1p1.month1,t1p1.week,t1p1。 cpg,t1p1.dept,t1p1.cust_id,t1p1.r_id,t1p1.p1,t1ic.ic,t1b1.b1,t1p2.p2,t1b2.b2 /

+0

添加外连接后,此功能正常工作并将所有属性拆分为单个查询 – user1760970