Почему я получаю ноль в определенных строках в результате этого деления? - PullRequest
0 голосов
/ 22 мая 2019

Я использую SQL Server 2014, и в моем запросе используется следующий синтаксис для вычисления результата деления.

USE MyDatabase

SELECT 
    ...
    CAST(cte1.[F&B] AS FLOAT) * CAST (cte1.[RN] / cte1.[Total RN] AS FLOAT) AS [F&B_Split],
    CAST(cte1.[F&B] AS FLOAT) * CAST (cte1.[RN] / cte1.[Total RN] AS FLOAT) / CAST(cte1.[GN] AS FLOAT) AS [F&B_Split_PerGN]
    ...
FROM 
    table1

Столбцы RN и GN в table1 являются целыми числами иСтолбец F&B имеет числовой тип.

Вот выдержка из моих результатов:

RN  TOTALRN    GN    F&B    F&B_Split      F&B_Split_PerGN
-------------------------------------------------------------
 9    9        18    1200     1200         66.6666666666667
 9    10       18    3900        0          0

Расчеты работают правильно, когда значения RN и TotalRN являютсято же самое (строка 1 выше), но дает 0 для F & B_Split и F & B_Split_PerGN (строка 2 выше).

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 22 мая 2019

Вам небезразличен тип деления. Я бы снял бросок, чтобы плавать. Но это ваш выбор.

Для меня самое простое решение - умножить на 1.0 перед делением:

CAST(cte1.[F&B] AS FLOAT) * CAST (cte1.[RN] * 1.0 / cte1.[Total RN] AS FLOAT) AS [F&B_Split],
CAST(cte1.[F&B] AS FLOAT) * CAST (cte1.[RN] * 1.0 / cte1.[Total RN] AS FLOAT) / CAST(cte1.[GN] AS FLOAT) AS [F&B_Split_PerGN]

Или:

cte1.[F&B] * cte1.[RN] * 1.0 / cte1.[Total RN] AS [F&B_Split],
cte1.[F&B]  * cte1.[RN] * 1.0 / cte1.[Total RN]  AS [F&B_Split_PerGN]

Если вам нужен конкретный тип для выражения, преобразуйте полное выражение :

convert(float, cte1.[F&B] * cte1.[RN] * 1.0 / cte1.[Total RN]) AS [F&B_Split],
convert(float, cte1.[F&B]  * cte1.[RN] * 1.0 / cte1.[Total RN]) AS [F&B_Split_PerGN]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...