Запрос на получение вычисленных значений из одного столбца в одной строке - PullRequest
1 голос
/ 11 марта 2020

РЕДАКТИРОВАТЬ: ВЫХОД требует также максимального значения даты в случае, если «dt» имеет разные значения для разных «dis_code». Я добавил 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 строка для отправленной, другая для открытой, и т. Д. c).

Пожалуйста, помогите мне исправить мой код.

1 Ответ

1 голос
/ 11 марта 2020

Использовать условное агрегирование.

В 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 Сервер:

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')
...