Получить сумму столбца и использовать для расчета процента от общего, почему не работает с CTE - PullRequest
0 голосов
/ 29 октября 2018

Я сделал этот следующий запрос, однако он дал результат 0 для каждого orderStatusName, кто-нибудь знает, в чем проблема?

with tbl as (
      select s.orderstatusName, c.orderStatusId,count(c.orderId) counts 
      from [dbo].[ci_orders] c left join
           [dbo].[ci_orderStatus] s 
           on s.orderStatusId = c.orderStatusId
      where orderedDate between '2018-10-01' and '2018-10-29'
      group by orderStatusName, c.orderStatusId
    )
select orderstatusName, counts/(select sum(counts) from tbl as PofTotal) from tbl

результат: 0

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы используете то, что известно как целочисленная математика. При использовании 2 целых чисел в SQL (Server) возвращаемое значение также является целым числом. Например, 2 + 2 = 4, 5 * 5 = 25. То же относится и к делению 8 / 10 = 0. Это потому, что 0.8 не является целым числом, но возвращаемое значение будет равно одному (поэтому десятичные точки теряются).

Обычный способ изменить это поведение - умножить одно из выражений на 1.0. Например:

counts/(select sum(counts) * 1.0 from tbl) as PofTotal

Если вам нужна большая точность, вы можете увеличить точность десятичного значения до 1.0 (т.е. до 1.000, 1.0000000 и т. Д.).

0 голосов
/ 29 октября 2018

Используйте оконные функции и правильное деление:

select orderstatusName, counts * 1.0 / total_counts
from (select t.*, sum(counts) over () as total_counts
      from tbl
     ) t;

Причина, по которой вы получаете 0, заключается в том, что SQL Server выполняет целочисленное деление, когда операнды являются целыми числами. Итак, 1/2 = 0, а не 0,5.

...