+-
查询以从同一行的同一列中获取计算值

编辑:如果'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')