SQL Server Десятичное разделение, возвращающее 1.000 - PullRequest
0 голосов
/ 18 апреля 2019

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

Я пытаюсь вернуть значения процентов для каждого элемента, относящегося к общему количеству отправок.Например, отписались / всего отправлено = 0,1% |

Я смотрел на это весь день и, кажется, не могу продвинуться дальше этого уровня, поэтому я действительно думаю, что пропустил что-то такое маленькое и глупое.

Вот изображение запроса / результатов, отображающих проблему:

enter image description here

Перед FROM я прокомментировал паруЛинии, которые я написал, чтобы попытаться решить эту проблему, пожалуйста, не смейтесь надо мной!: P

SELECT
    'Unsubscribes' AS 'Type',
    COUNT(e.eventid) AS 'Total',
    -- e2.all_values AS 'Total',
    -- ISNULL(NULLIF(COUNT(CAST(e.eventid AS DECIMAL(15,2))), 0) / 
    COUNT(CAST(e2.all_values as decimal(15,2))),0) AS '%',
    -- CAST(COUNT(e.EventID) as decimal(15,2)) / CAST(COUNT(e2.all_values) AS DECIMAL(15,2)) AS '%'
    CONVERT(DECIMAL(15,2), COUNT(e.EventID)) /  CONVERT(DECIMAL(15,2), 
    COUNT(e2.all_values)) AS '%'
    COUNT(e2.all_values))
FROM 
    XMPDBTRACKING.XMPieTracking.Event e
LEFT JOIN 
    (SELECT
         COUNT(e2.eventid) AS 'all_values',
         MarketingCampaignID
     FROM 
         xmpdbtracking.xmpietracking.event e2
     WHERE 
         e2.marketingcampaignid = 16704
         AND e2.eventtypeid IN (20)
     GROUP BY 
         MarketingCampaignID) e2 ON e2.MarketingCampaignID = e.MarketingCampaignID
 WHERE 
     e.MarketingCampaignID = 16704
     AND e.EventTypeID IN (24)

Я пытаюсь вернуть значение Unsubscribees / Total Sends как% Value

Total Send  4366    100.000000000000000000
Unsubscribes    65  1.000000000000000000

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Ваш основной запрос считает отписки, верно? Внешнее соединение LEFT означает, что оно будет соответствовать только строкам, существующим в основном запросе. Таким образом, вы запрашиваете только «отписался».

Как насчет этого (не проверено):

;WITH sums AS
(
  SELECT MarketingCampaignID
  ,      SUM(CASE EventTypeID WHEN 20 THEN 1 ELSE 0 END) AS Event20
  ,      SUM(CASE EventTypeID WHEN 24 THEN 1 ELSE 0 END) AS Event24
  GROUP BY MarketingCampaignID
)
SELECT MarketingCampaignID
,      CAST(Event24 as decimal(15,2)) / CAST(Event20 AS decimal(15,2))
FROM sums
0 голосов
/ 18 апреля 2019

Попробуйте изменить эту строку:

CONVERT(DECIMAL(15,2), COUNT(e.EventID)) / CONVERT(DECIMAL(15,2), COUNT(e2.all_values)) AS '%'

до:

CONVERT(DECIMAL(15,2), CONVERT(DECIMAL(15,2), COUNT(e.EventID)) / CONVERT(DECIMAL(15,2), COUNT(e2.all_values)) AS '%

Может быть, это из-за того, что результат подсчета является целым, а не десятичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...