Informatica实现SQL中COUNT(DISTINCT+CASE WHEN)以及SUM(CASE WHEN ELSE number)

Informatica实现SQL中COUNT(DISTINCT+CASE WHEN)以及SUM(CASE WHEN ELSE number)

8 6 月, 2016 阅读 450 字数 1633 评论 0 喜欢 0

本文章将通过实例讲解如何利用Informatica—-文章周钰原创,请勿转载。

1.实现SQL中COUNT(DISTINCT+CASE WHEN)

2.SUM(CASE WHEN ELSE number)

 

下面是SQL:

INFA_DISTINCT+CASE WHEN

 

这里我暂时想到三种方法:

方法一,使用AGG组件:

优点:可以GROUP BY

(1)没有CASE WHEN ELSE 0的情况:

COUNT(字段, 条件)

这里因为我们需要做到DISTINCT,所以条件写的刚好与SQL中写的相反。

例子:

INFA_DISTINCT+CASE WHEN2

这段SQL 对应的代码就应该是这样:

COUNT(T3.ORICONTACTID, T1.LASTSTATUS != 28 OR T3.CALLDIRECTION != 1 OR T3.CALLTYPE != 1)

?

SUM(字段,条件)

这里因为不需要DISTINCT,所以条件写的与SQL相同

例子:

INFA_DISTINCT+CASE WHEN3

这段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(字段,条件)

例子:

INFA_DISTINCT+CASE WHEN4

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值)等函数来进行聚合。

 

发表回复

蜀ICP备15005542号