Функция SQL Cast, Case и Count - PullRequest
       22

Функция SQL Cast, Case и Count

0 голосов
/ 21 октября 2019

Я пытаюсь подсчитать количество открытых сообщений электронной почты и разделить их на общее количество отправленных сообщений электронной почты и преобразовать их в десятичное число (чтобы он отображал процент).

Я получаю сообщение об ошибке: "An error occurred while checking the query syntax. Errors: Incorrect syntax near ')'."

Я попытался разделить код, чтобы можно было раздельно использовать функцию count и case. В ролях работает без учета / дела. Подсчет / регистр также работает независимо, кажется, что он не работает вместе. Я что-то здесь упускаю?

SELECT
SubscriberKey
,CAST(
 ((COUNT(CASE 
                WHEN PreviousMonth <= 1
                    AND SendType = 'Auto'
                    AND Opened = 1
                    THEN 1
                ELSE NULLEND ))/
        (COUNT(CASE 
                WHEN PreviousMonth <= 1
                    AND SendType = 'Auto')))
AS DECIMAL(18,4)) * 100 AS 'AverageOpen'
FROM Data
GROUP BY SubscriberKey

An error occurred while checking the query syntax. Errors: Incorrect syntax near ')'.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Я думаю, что вы хотите достичь здесь, чтобы получить average из opened = 1 divided by all.

SELECT cast((t1.Opened/t1.OverAll) as decimal(18,4)) * 100.00 as 'AverageOpen'
FROM
    (SELECT 
        SubscriberKey
        , SUM(CASE WHEN PreviousMonth <= 1 AND SendType = 'Auto' AND Opened = 1 THEN 1 ELSE 0 END) Opened,
        , SUM(CASE WHEN PreviousMonth <= 1 AND SendType = 'Auto' THEN 1 ELSE 0 END) OverAll
    FROM Data 
    GROUP BY SubscriberKey) as t1
0 голосов
/ 21 октября 2019

Я бы написал это, используя SUM(CASE). Обратите внимание на две вещи:

  • 1.0, поэтому деление не является целым числом (что может быть проблемой в некоторых базах данных.
  • Нет else в знаменателе, чтобы избежать деления наноль

Я также пропустил cast():

SELECT SubscriberKey
       (SUM(CASE WHEN PreviousMonth <= 1 AND
                      SendType = 'Auto'
                      Opened = 1
                 THEN 1.0 ELSE 0 
            END) /
        SUM(CASE WHEN PreviousMonth <= 1 AND
                      SendType = 'Auto'
                 THEN 1   -- no else so no divide by 0
            END)
       ) * 100 AverageOpen
FROM Data
GROUP BY SubscriberKey;

Возможно, ваш код не выполняется из-за того, что NULLEND не распознается в SQL.

...