Я пытаюсь рассчитать коэффициент открытия для наших подписчиков, складывая количество отправленных им писем, количество тех писем, которые они открыли, а затем, наконец, пытаюсь рассчитать коэффициент, взяв их количество открытий/отправленных. Проблема, которую я обнаружил, заключается в том, что записи с результатами, не равными «100», загружаются с «0,00» вместо истинного расчета. Расширение исходных данных и цель совпадают, для запроса задано значение «Обновить».

Пример расширения данных:

SubscriberKey   | SentCount | OpenCount | Ratio
(Text Char-254) | (Number)  | (Number)  | (Decimal 18,4)
11111           | 25        | 5         |
22222           | 13        | 8         |
33333           | 25        | 5         |
44444           | 15        | 15        |
55555           | 12        | 0         |

Пример текущего результата:

SubscriberKey   | SentCount | OpenCount | Ratio
(Text Char-254) | (Number)  | (Number)  | (Decimal 18,4)
11111           | 25        | 5         | 0.00
22222           | 13        | 8         | 0.00
33333           | 25        | 5         | 0.00
44444           | 15        | 15        | 100.00
55555           | 12        | 0         | 0.00

Пример запроса:

SELECT
c.SubscriberKey,
CAST(((c.OpenCount / c.SentCount) * 100) AS DECIMAL(18, 2)) as Ratio
FROM DataTable c

Результат цели:

SubscriberKey   | SentCount | OpenCount | Ratio
(Text Char-254) | (Number)  | (Number)  | (Decimal 18,4)
11111           | 25        | 5         | 20.00
22222           | 13        | 8         | 61.54
33333           | 25        | 5         | 20.00
44444           | 15        | 15        | 100.00
55555           | 12        | 0         | 0.00
1
Adam Spriggs 3 Янв 2019 в 06:38

1 ответ

Лучший ответ

Почти уверен, что вам нужно разыгрывать каждый элемент отдельно. Нравится:

SELECT
c.SubscriberKey,
cast((c.openCount) as decimal(18,4)) / cast(c.SentCount as decimal(18,4)) * 100 as Ratio
FROM DataTable c

Или лучше:

SELECT
c.SubscriberKey
, case
    when ISNULL(c.SentCount,0) = 0 AND ISNULL(c.OpenCount,0) > 0 then 100.0
    when (cast(c.OpenCount as Decimal (18,4))/cast(c.SentCount as Decimal (18,4))) > 1 then 100.0
    else (cast(c.OpenCount as Decimal (18,4))/cast(c.SentCount as Decimal (18,4))) * 100.0
  end as OpenRate
FROM DataTable c
2
Adam Spriggs 3 Янв 2019 в 06:37
Это сработало! Я понимаю, что ваша «лучшая» версия помогает избежать попытки деления на 0 в ситуации 0/0, но одно замечание, о котором я забыл упомянуть, заключалась в том, что раньше я выбирал только подписчиков, которым было отправлено не менее 10 электронных писем, а затем открывается были основаны на этих предыдущих посылах. В моей ситуации не должно быть никакой необходимости в дополнительной защите, но полезно знать, если я решу рассчитать более широко!
 – 
Brian C
3 Янв 2019 в 06:52