Вычисление% внутри оператора case работает некорректно - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь определить процент расходов кого-либо с партнером как процент от общих расходов всех партнеров. Я делаю это в приведенном ниже утверждении case .. код выполняется, но когда я тестирую некоторые примеры, помеченные как 90%, они находятся под. Я попробовал это, используя teradata sql, и с тех пор решил проблему, выполнив ее в несколько этапов в SAS, рассчитав% и затем отфильтровав их. Просто пытаюсь понять, почему приведенное ниже не работает правильно?

case when partner_spend > 0 and  partner_spend/total_spend >= 0.9 
    then '90% partner' 
    else 'other' 
end as spend_90

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 24 января 2020

Вероятно, проблема в целочисленном делении. Если оба значения являются целыми числами или тому подобное, Teradata выдаст целочисленный результат, применяя правила округления: поэтому, в основном, если результаты равны 0.5 или больше, результат будет 1.

. это путем приведения значений к десятичному числу с достаточной точностью или путем добавления (фиктивного) множителя:

case when partner_spend > 0 and 1.00 * partner_spend/total_spend >= 0.9 
    then '90% partner' 
    else 'other' end 
as spend_90

Или:

case when partner_spend > 0 and cast(partner_spend as decimal(10, 2))/total_spend >= 0.9 
    then '90% partner' 
    else 'other' end 
as spend_90
0 голосов
/ 24 января 2020

Если total_spend не может быть отрицательным, первое условие бесполезно, поэтому его можно упростить до:

(case when partner_spend * 1.0 / total_spend >= 0.9 
      then '90% partner' 
      else 'other' 
 end) as spend_90

Или, как я предпочитаю:

(case when partner_spend >= total_spend * 0.9 
      then '90% partner' 
      else 'other' 
 end) as spend_90

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

...