+-
编辑:如果'dt'对于不同的'dis_code'具有不同的值,则OUTPUT也需要最大日期值。我在批准的答案中添加了max(dt),但不能解决问题。
我的表如下:
Cust_id Trtmnt_cd dt dis_code
A A123 2019-01-15 SENT
A A123 2019-01-16 OPEN
A A123 2019-01-20 CLICK
我的代码:
select a.cust_id,a.trtmnt_cd,max(A.offr_proposed),max(B.cust_response)
FROM
(SELECT a.cust_id,a.trtmnt_cd,
case when trim(a.dis_code) in ('SENT') then 1 else 0 end as offr_proposed
FROM tbl1 a
group by cust_id,a.trtmnt_cd,a.dis_code) A
inner join
(SELECT b.cust_id,b.trtmnt_cd,
case when trim(b.dis_code) in ('OPEN','CLICK') then 1 else 0 end as cust_response
FROM tbl1 b
group by b.cust_id,b.trtmnt_cd,b.disp_code) B
On (A.cust_id = B.cust_id and A.trtmnt_cd = B.trtmnt_cd)
group by A.cust_id,A.trtmnt_cd,A.offr_proposed,B.cust_response
上述查询的输出:
Cust_Id trtmnt_cd offr_proposed cust_response
A A123 1 0
A A123 1 1
Desired Output:
Cust_Id trtmnt_cd dt offr_proposed cust_response
A A123 2019-01-20 1 1
[基本上,我想为每个客户提供一个唯一的数据行,它告诉我要约是否已发送(1或0)以及对要约的客户响应(1或0)。当前数据表中的每个要约事件都有多行,即(发送一行,打开另一行等)。
请指导我更正我的代码。
1
投票
投票
使用条件聚合。
在MySQL中:
select
cust_id
trtmnt_cd,
max(dis_code = 'SENT') offr_proposed,
max(dis_code = 'CLICK') offr_response
from tbl1
group by cust_id, trtmnt_cd
在SQL Server中:
select
cust_id
trtmnt_cd,
max(case when dis_code = 'SENT' then 1 else 0 end) offr_proposed,
max(case when dis_code = 'CLICK' then 1 else 0 end) offr_response
from tbl1
group by cust_id, trtmnt_cd
您可以使用以下where
子句优化查询(然后,如果要约没有上述两个事件中的任何一个,则该要约将不会出现在结果集中:]
where dis_code in ('SENT', 'CLICK')