如果超过1,带有详细信息行的2个表的Oracle join应返回1

时间:2012-09-18 14:05:34

标签: oracle join

Oracle sql查询根据事务类型返回行。这用于分析目的

SELECT YEAR
       , MONTH
       , source
       , count(distinct T.tx_id  ) no_of_txn
       , sum((CASE WHEN D.type = 1 THEN 1  ELSE 0 END ))  A_TXN 
       , sum((CASE WHEN D.type = 2 THEN 1  ELSE 0 END )) d_TXN
FROM TXN_HEADER T , TXN_DETAIL D  WHERE OPEN_AMT > 0   
AND  T.tx_id  = D.tx_id (+)
AND  T.tx_id  in ( 23414, 23123)
GROUP BY YEAR,MONTH,source

输出

YEAR   MONTH  SOURCE  NO_OF_TXN  A_TXN D_TXN
2012   09     11      2          17    2

此处详细信息表中的总行数为19(17 +2)和标题2(2 Txn)

我所需的输出是总txn 2,a_txn 2和D_txn 2.这意味着如果txn超过1 a_txn,则对于D_txn,它将被视为1相同

最终预期产出

YEAR   MONTH  SOURCE  NO_OF_TXN A_TXN   D_TXN
2012   09     11      2         2       2

1 个答案:

答案 0 :(得分:1)

您可以将COUNTDISTINCT表达式一起使用:它将计算表达式的所有distinct和not null实例。所以如果我理解你的要求,这应该做到这一点:

SELECT YEAR
       , MONTH
       , source
       , count(distinct T.tx_id  ) no_of_txn
       , COUNT(DISTINCT CASE WHEN D.type = 1 THEN T.tx_id END)  A_TXN 
       , COUNT(DISTINCT CASE WHEN D.type = 2 THEN T.tx_id END)  d_TXN
FROM TXN_HEADER T , TXN_DETAIL D  WHERE OPEN_AMT > 0   
AND  T.tx_id  = D.tx_id (+)
AND  T.tx_id  in ( 23414, 23123)
GROUP BY YEAR,MONTH,source