为什么我为此选择的所有行获得0?某些行具有语句中所有变量的值,因此它不正确。 语法错误? 运营顺序?
我把头撞在墙上。
SELECT
(isnull(VG.totalSales,0)/(case when ((isnull(IB.warehouseInventory,0)+isnull(IT.storesInventory,0)+isnull(VG.totalSales,0))=0) then 20 else (isnull(IB.warehouseInventory,0)+isnull(IT.storesInventory,0)+isnull(VG.totalSales,0))end*100)) as percentageSold
FROM dbo.myTable
更新:
我的问题与0/0有关,不允许使用哪个SQL和数学。
下面是我的完整SQL块。
我遇到问题的行标有大评论栏,请向下滚动。这是唯一一个无效的列。所有其他列都正常工作,所以请随意忽略它们。
请原谅代码中语言的变化;我将我的变量翻译为我以前的帖子'但对于这个来说太过分了。
DECLARE @infosReferenciasGlobalPorExtension TABLE
(
referencia varchar(max),
extension varchar(max),
talla varchar(max),
descripcion varchar(max),
inventarioBodega int,
vendidasGlobal int,
inventarioTiendas int,
fechaEntradaTiendas varchar(8),
loteInicial int,
porcentajeVendido float
)
INSERT INTO @infosReferenciasGlobalPorExtension
SELECT
R.referencia,
R.extension,
R.talla,
R.descripcion,
(isnull(IB.inventarioBodega,0)),
(isnull(VG.vendidasGlobal,0)),
(isnull(IT.inventarioTiendas,0)),
FET.fechaEntradaTiendas,
(isnull(IB.inventarioBodega,0)+isnull(IT.inventarioTiendas,0)+isnull(VG.vendidasGlobal,0)) as loteInicial,
----------
--RIGHT BELOW THIS COMMENT IS THE LINE I HAVE TROUBLE WITH, BECAUSE 0/0 IS NOT ALLOWED.
--SOMETIMES THE THREE VALUES THAT MAKE UP THE DENOMINATOR ARE 0, LEADING TO A 0 DENOMINATOR.
----------
ISNULL(VG.vendidasGlobal, 0) / (ISNULL(IB.inventarioBodega, 0)+ ISNULL(IT.inventarioTiendas, 0) + ISNULL(VG.vendidasGlobal, 0) ) AS porcentajeVendido
FROM @referencias as R
FULL OUTER JOIN @inventarioBodega as IB
ON R.referencia=IB.referencia AND R.extension=IB.extension AND R.talla=IB.talla
FULL OUTER JOIN @vendidasGlobal as VG
ON R.referencia=VG.referencia AND R.extension=VG.extension AND R.talla=VG.talla
FULL OUTER JOIN @inventarioTiendas as IT
ON R.referencia=IT.referencia AND R.extension=IT.extension AND R.talla=IT.talla
FULL OUTER JOIN @fechaEntradaTiendas as FET
ON R.referencia=FET.referencia AND R.extension=FET.extension AND R.talla=FET.talla
--si no tienen lote inicial, es una talla que nunca tiene, como XXL o xxs
WHERE (isnull(IB.inventarioBodega,0)+isnull(IT.inventarioTiendas,0)+isnull(VG.vendidasGlobal,0))>0
答案 0 :(得分:3)
正如其他人所提到的,问题是整数除法。当分子和分母是整数时,结果也将是整数。例子
select 1/2
您希望结果为0.5
,但结果为0
。要获得结果中的小数部分,您需要将分子或分母转换为十进制数。
select 1/2.0 --or 1.0/2
会给你0.5
作为结果。因此,在您的情况下,只需将* 100
设为* 100.0
或将分子或分母与1.0
相乘,即可获得结果中的小数部分。您的查询也可以像这样简化
SELECT Isnull(VG.totalSales, 0) / (COALESCE(NULLIF(Isnull(IB.warehouseInventory, 0)
+ Isnull(IT.storesInventory, 0)
+ Isnull(VG.totalSales, 0), 0), 20) * 100.0) AS percentageSold
FROM dbo.myTable
更新:要修正除零,请在分母中使用NULLIF
ISNULL(VG.vendidasGlobal, 0) /
NULLIF((ISNULL(IB.inventarioBodega, 0)+ ISNULL(IT.inventarioTiendas, 0) + ISNULL(VG.vendidasGlobal, 0) ),0) AS porcentajeVendido
答案 1 :(得分:1)
CAST
你的分母或分子浮点/小数。
SELECT ( ISNULL(VG.totalSales, 0)
/ CAST(( CASE WHEN (( ISNULL(IB.warehouseInventory, 0)
+ ISNULL(IT.storesInventory, 0)
+ ISNULL(VG.totalSales, 0)
) = 0
) THEN 20
ELSE
( ISNULL(IB.warehouseInventory, 0) + ISNULL(IT.storesInventory, 0)
+ ISNULL(VG.totalSales, 0)
)
END * 100
) AS Float)
) AS percentageSold
FROM dbo.myTable;
答案 2 :(得分:0)
你可以这样试试......
SELECT
percentageSold = ISNULL(VG.totalSales, 0) / ISNULL(NULLIF(ISNULL(IB.warehouseInventory, 0)+ ISNULL(IT.storesInventory, 0)+ ISNULL(VG.totalSales, 0), 0), 20) * 100
FROM
dbo.myTable;