SQL Server Percentage calculation not calculating correctly

风格不统一 提交于 2019-12-12 02:04:41

问题


I have this SQL statement that works fine other than the OrderCountPercentage calculation. I cannot understand why it is not calculating these as the formula is correct. I can only think its to do with the the fact this is using the COUNT function. Any help appreciated.

SELECT Table2014.OrderDate                                                                                AS December2014OrderDate,
       ISNULL(Table2014.Total, 0)                                                                         AS December2014DailySales,
       ISNULL(Table2013.Total, 0)                                                                         AS December2013DailySales,
       ISNULL(Table2014.Total, 0) - ISNULL(Table2013.Total, 0)                                            AS DailySalesDifference,
       ( ISNULL(Table2014.Total, 0) - ISNULL(Table2013.Total, 0) ) / NULLIF(Table2013.Total, 0) * 100     AS SalesPercentage,
       ISNULL(Table2014.OrderCount, 0)                                                                    AS December2014DailyOrderCount,
       ISNULL(Table2013.OrderCount, 0)                                                                    AS December2013DailyOrderCount,
       ISNULL(Table2014.OrderCount, 0) - ISNULL(Table2013.OrderCount, 0)                                  AS DailyOrderCountDifference,
       ( ISNULL(Table2014.OrderCount, 0) - ISNULL(Table2013.OrderCount, 0) ) / Table2013.OrderCount * 100 AS Percentage
FROM   (SELECT Sum(order_header_total.oht_net)                           AS Total,
               Dateadd(DAY, 0, Datediff(D, 0, order_header.oh_datetime)) AS OrderDate,
               Count(order_header.oh_order_number)                       AS OrderCount
        FROM   dbo.order_header_total
               INNER JOIN dbo.order_header
                       ON order_header_total.oht_oh_id = order_header.oh_id
        WHERE  order_header.oh_datetime BETWEEN '12/01/2014 00:00:00' AND '12/31/2014 23:59:59'
               AND order_header.oh_os_id IN ( 1, 6, 4 )
               AND order_header.oh_cd_id = 76
        GROUP  BY Dateadd(DAY, 0, Datediff(D, 0, order_header.oh_datetime))) Table2014
       LEFT OUTER JOIN (SELECT Sum(order_header_total.oht_net)                                             AS Total,
                               Dateadd(YEAR, 1, Dateadd(DAY, 0, Datediff(D, 0, order_header.oh_datetime))) AS OrderDate,
                               Count(order_header.oh_order_number)                                         AS OrderCount
                        FROM   dbo.order_header_total
                               INNER JOIN dbo.order_header
                                       ON order_header_total.oht_oh_id = order_header.oh_id
                        WHERE  order_header.oh_datetime BETWEEN '12/01/2013 00:00:00' AND '12/31/2013 23:59:59'
                               AND order_header.oh_os_id IN ( 1, 6, 4 )
                               AND order_header.oh_cd_id = 76
                        GROUP  BY Dateadd(YEAR, 1, Dateadd(DAY, 0, Datediff(D, 0, order_header.oh_datetime)))) Table2013
                    ON Table2013.OrderDate = Table2014.OrderDate
ORDER  BY Table2014.OrderDate 

回答1:


The problem is probably integer division. I assume you are referring to:

 (ISNULL(Table2014.OrderCount, 0) - ISNULL(Table2013.OrderCount, 0)) / Table2013.OrderCount * 100 AS Percentage

If all these are integers, the division is an integer. I usually solve this by multiplying by 1.0. But perhaps a more formal way is to convert one of the values to a float or numeric:

 (ISNULL(Table2014.OrderCount, 0) - ISNULL(Table2013.OrderCount, 0)) / cast(Table2013.OrderCount as float) * 100 AS Percentage


来源:https://stackoverflow.com/questions/27818719/sql-server-percentage-calculation-not-calculating-correctly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!