SQL:正确使用case语句?

时间:2017-10-04 02:32:54

标签: sql-server tsql case

为什么我为此选择的所有行获得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

3 个答案:

答案 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;