Sql server 2012 将一列除以另一列时获取空值

Sql server 2012 将一列除以另一列时获取空值,sql-server-2012,Sql Server 2012,我正在检索一些计数,如按季度分组的“新产品”和“销售额”。我需要计算这些计数的比率。因此,我的查询如下: select YR, QTR, MAX(#ofsales) AS '# of Sales', MAX(#Totalproducts) AS '# of Total Products', MAX(#ofsales*100/#Totalproducts) AS '% of Products Sold', MAX(#Tot

我正在检索一些计数,如按季度分组的“新产品”和“销售额”。我需要计算这些计数的比率。因此,我的查询如下:

select YR, 
       QTR, 
       MAX(#ofsales) AS '# of Sales', 
       MAX(#Totalproducts) AS '# of Total Products',
       MAX(#ofsales*100/#Totalproducts) AS '% of Products Sold',
       MAX(#Totalproducts/#ofsales) AS 'Inventory'
from (union of few tables)
order by YR, QTR
group by YR, QTR;
结果是:

Yr   | Qtr   |# of Sales|# of Total products|% of Products Sold|Inventory
2016 |  1    |   5231   |       7239        |      NULL        |  NULL
2016 |  2    |   3678   |       4752        |      NULL        |  NULL 
我使用MAX()运算符是因为否则,我会出现如下错误:

Column '#ofsales' is invalid in the select list because it is not 
contained in either an aggregate function or the GROUP BY clause
为了回答@mypetlion的问题,这里是我不带MAX()函数的查询

select YR, 
       QTR, 
       #ofsales AS '# of Sales', 
       #Totalproducts AS '# of Total Products',
       #ofsales*100/#Totalproducts AS '% of Products Sold',
       MAX(#Totalproducts/#ofsales) AS 'Inventory'
from (union of few tables)
order by YR, QTR
group by YR, QTR;

可以使用COALESCE函数包装分母。它将检查该值是否为NULL,并返回您给它的值。因为您试图避免被零除的错误,所以可以让它返回1

select YR, 
       QTR, 
       #ofsales AS '# of Sales', 
       #Totalproducts AS '# of Total Products',
       #ofsales*100/#Totalproducts AS '% of Products Sold',
       MAX(#Totalproducts/COALESCE(#ofsales, 1)) AS 'Inventory'
from (union of few tables)
order by YR, QTR
group by YR, QTR;

由于MAX()函数的原因,无法找到在原始查询中进行除法的方法。因此,作为一种解决方法,我将所有结果导入到一个新表中,然后应用除法,结果很好。

是否有任何变量
NULL
?为了理解,您使用的是
MAX()
函数,不是因为您希望最大化某些内容,而是因为您在没有它的情况下得到了一个错误?如果没有
MAX()
函数,您的查询是什么样子的?每个变量的数据类型是什么?@mypetlion,只有几行的“#of Sales”值为空。所有其他行都具有正确的整数值。是的,我使用MAX()函数只是为了避免聚合或分组错误。我已经更新了我的问题以显示没有MAX()函数的查询,但由于前面提到的“聚合或分组错误”,它无法工作。变量“#of Sales”和“#Totalproducts”是求和积,所以我确信它们是整数数据类型。刚刚尝试过,现在在“Inventory”列中,我得到的值与“of Sales”列的值相同。知道这里有什么问题吗?任何除以1的值都等于它本身。如果您不想在sales的#为NULL时获得#Totalproducts,那么您需要以不同的方式编写SQL。行:
MAX(#Totalproducts/COALESCE(#of sales,1))作为“库存”
应更改为:
CASE WHEN COALESCE(#of sales,'N/A')==“N/A”,然后如果#of sales为空,则返回您想要返回的任何内容;否则(#Totalproducts/#of sales)作为“库存”结束。
谢谢,@hajile78。我明白COALESCE在这里做什么。但是,它返回的是“Totalproducts”,即使“Totalproducts”和“Sales”都不为空。除法在任何情况下都不会发生。可能是您试图对计算值运行MAX Aggregate函数。我认为在原始Select语句中无法完成。你的解决办法似乎是个好办法。