gpt4 book ai didi

sql-server - SQL : Correct use of the case statement?

转载 作者:行者123 更新时间:2023-12-01 12:17:59 25 4
gpt4 key购买 nike

为什么我选择的所有行都为 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 block 。

我遇到问题的行已用大评论 block 标记,请向下滚动。这是唯一不能正常工作的列。所有其他列都工作正常,所以请随意忽略它们。

请原谅代码中的语言变化;我为我的“上一篇文章”翻译了我的变量,但对于这篇文章来说太多了。

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

最佳答案

正如其他人提到的问题是整数除法。当分子和分母是整数时,结果也将是整数。例子

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

关于sql-server - SQL : Correct use of the case statement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46556120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com