SQL Server百分比计算无法正确计算

时间:2015-01-07 11:41:53

标签: sql sql-server percentage

我有这个SQL语句,除了OrderCountPercentage计算之外还可以正常工作。我无法理解为什么不计算这些因为公式是正确的。我只能认为它与使用COUNT函数这一事实有关。任何帮助表示赞赏。

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 个答案:

答案 0 :(得分:1)

问题可能是整数除法。我假设你指的是:

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

如果所有这些都是整数,则除法是整数。我通常乘以1.0来解决这个问题。但也许更正式的方法是将其中一个值转换为浮点数或数字:

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