Почему мой расчет процента не работает правильно, когда я делю? - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь увидеть, какой процент клиентов платит LL и процент клиентов, которые платят LP. Например, у меня 1 клиент в LL и 1 в LP, поэтому процент должен быть 50% в Cust_LL_Pct и Cust_LP_Pct. Я попытался использовать ISNULL и установить его в 0, но это не решило проблему. Столбцы Pct дают только 0 и 1, ничего между ними. введите описание изображения здесь

[SELECT
 b.country_IBS AS Country_IBS_LL
,b.Sku AS SKU_LL
,b.TY_Sales_USD_LL 
,b.TY_Qty_LL
,b.TY_Sales_USD_LL / (b.TY_Qty_LL) AS ASP_LL
,b.Customer_Count_LL
,a.country_IBS AS Country_IBS_LP
,a.Sku AS SKU_LP
,a.Total_LP_Sales
,a.Total_LP_Qty
,a.Total_LP_Sales / a.Total_LP_Qty AS ASP_LP
,a.Customer_Count_LP
,SUM(ISNULL(b.Customer_Count_LL,0) + ISNULL(a.Customer_Count_LP,0)) AS SKU_Total_Customer
,ISNULL(b.Customer_Count_LL,0) / SUM(ISNULL(b.Customer_Count_LL,0) + ISNULL(a.Customer_Count_LP,0)) AS Cust_LL_Pct
,ISNULL(a.Customer_Count_LP,0) / SUM(ISNULL(b.Customer_Count_LL,0) + ISNULL(a.Customer_Count_LP,0)) AS Cust_LP_Pct
--INTO #temp6
FROM #temp2 a
FULL JOIN #temp5 b
ON a.Sku = b.Sku
AND a.country_IBS = b.country_IBS
GROUP BY
b.country_IBS
,b.Sku
,b.TY_Sales_USD_LL
,b.TY_Qty_LL
,b.TY_Sales_USD_LL / b.TY_Qty_LL 
,b.Customer_Count_LL
,a.country_IBS
,a.Sku
,a.Total_LP_Sales
,a.Total_LP_Qty
,a.Total_LP_Sales / a.Total_LP_Qty 
,a.Customer_Count_LP][1]

1 Ответ

2 голосов
/ 17 апреля 2020

Проблема в целочисленном делении. Когда оба операнда являются целыми числами, SQL Сервер выдает целочисленный результат: например, 3/2 дает 1, а не 1.5.

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

1.0 * b.TY_Sales_USD_LL / b.TY_Qty_LL AS ASP_LL

Я бы не рекомендовал использовать isnull(..., 0) для правильного операнда деления: если значение действительно null, вы получите деление на 0, что является фатальной ошибкой. С другой стороны, деление на null дает null, что не является ошибкой и кажется более уместным.

...