本文章将通过实例讲解如何利用Informatica—-文章周钰原创,请勿转载。
1.实现SQL中COUNT(DISTINCT+CASE WHEN)
2.SUM(CASE WHEN ELSE number)
下面是SQL:
这里我暂时想到三种方法:
方法一,使用AGG组件:
优点:可以GROUP BY
(1)没有CASE WHEN ELSE 0的情况:
COUNT(字段, 条件)
这里因为我们需要做到DISTINCT,所以条件写的刚好与SQL中写的相反。
例子:
这段SQL 对应的代码就应该是这样:
COUNT(T3.ORICONTACTID, T1.LASTSTATUS != 28 OR T3.CALLDIRECTION != 1 OR T3.CALLTYPE != 1)
?
SUM(字段,条件)
这里因为不需要DISTINCT,所以条件写的与SQL相同
例子:
这段SQL 对应的代码就应该是这样:
SUM(T1.LASTSTATUSTIMELEN,T1.LASTSTATUS = 23 AND T1.CURRSTATUS = 28 AND T3.CALLDIRECTION = 1 AND T3.CALLTYPE = 1)
?
(2)有CASE WHEN ELSE 0的情况:
原理:输出SUM = 总SUM – 不满足条件SUM
总SUM = SUM(字段)
不满足条件SUM = SUM(字段,条件)
例子:
1.计算总SUM:
总SUM = SUM(T1.LASTSTATUSTIMELEN)
2.计算条件SUM:
这里因为不需要DISTINCT,所以条件写的与SQL相同
不满足条件SUM =?SUM(T1.LASTSTATUSTIMELEN,T1.LASTSTATUS != 28 OR T3.CALLDIRECTION != 1 OR T3.CALLTYPE != 1)
3.计算条件SUM:
输出SUM = 总SUM-条件SUM
?????? ?= SUM(T1.LASTSTATUSTIMELEN)- SUM(T1.LASTSTATUSTIMELEN,T1.LASTSTATUS != 28 OR T3.CALLDIRECTION != 1 OR T3.CALLTYPE != 1)—-公式1
????? ?=SUM(T1.LASTSTATUSTIMELEN,T1.LASTSTATUS = 28 AND T3.CALLDIRECTION = 1 AND T3.CALLTYPE = 1)—-公式2
说明:因为这里SQL中是ELSE 0,即不满足条件不计算数据,即使用反面的条件就行了,即公式2。
方法二,使用ROUTER,若干个SORTER,若干个AGG:
缺点:不能进行GROUP BY,分别每组聚合。(可以事先做好分组,但是分组太多时候岂不是疯掉吗?)
原理:使用不同组件,完成SQL的不同子句的功能。
实现:
1.使用ROUTER,根据条件分流数据(因为ROUTER有COPY作用,所以严格来也不叫分流,同一条数据只要满足多个条件可以进到多个分组)。
分组条件:就是SQL中CASE?WHEN?的条件,
分组中保留的字段:根据SQL保留。
—-完成SQL中CASE?WHEN
2.各组连到独立的SORTER(选上DISTINCT选项,即达到去重效果),
—-完成SQL中DISTINCT,附带ORDER BY
3.各组连到独立的AGG,根据需求进行(COUNT,SUM)
—-完成SQL中的聚合计算。
方法三,FLAG法:
原理:在AGG,前增加一个PORT,用来标记哪些数据是需要聚合的,需要如何聚合(通过FLAG的数值区别)及哪些是不需要的。
优点:最后也可以GROUP BY
缺点:在实现整理没有其他用途的情况下,这么做与方法一比,就是多此一举。造成同一条实际判断两次(实现处理一次,实际处理一次)。
实现:
1.在EXP组件中增加一个PORT,作为FLAG。
2.根据你的SQL编辑公式,编辑FLAG 的公式,给每行数据的FLAG 赋值。
提示:IIF()嵌套就可以搞定。
3.使用AGG组件,在聚合的时候,使用COUNT(字段, FLAG值),SUMT(字段, FLAG值)等函数来进行聚合。








