SQL中NULL的妙用

商品表Products

库房表WarehouseDistrict

库存表WarehouseStock

 

一般写法

DECLARE @districtId INT = 2454

;WITH stock
AS
(
    SELECT DistrictId, ProductId
        , ws.Inventory
    FROM dbo.WarehouseDistrict wd
    INNER JOIN dbo.WarehouseStock ws 
        ON ws.IsOffMarket = 0

        AND wd.WarehouseId = ws.WarehouseId

    WHERE wd.IsDelete = 0
        AND (0 = ISNULL(@districtId, 0) OR wd.DistrictId = @districtId)
    GROUP BY DistrictId, ProductId, ws.Inventory
)
SELECT a.DistrictId, a.ProductId, ISNULL(b.Inventory, 0) Inventory
FROM  stock a
LEFT JOIN (SELECT DistrictId, ProductId, MIN(Inventory) Inventory
    FROM stock
    WHERE Inventory > 0 /*小于0的,忽略*/
    GROUP BY DistrictId, ProductId) b
     ON a.DistrictId = b.DistrictId
     AND a.ProductId = b.ProductId

利用聚合函数忽略NULL

DECLARE @districtId INT = 2454

SELECT DistrictId, ProductId
    , ISNULL( MIN(CASE WHEN ws.Inventory <= 0 THEN NULL ELSE ws.Inventory END), 0) Inventory
FROM dbo.WarehouseDistrict wd
INNER JOIN dbo.WarehouseStock ws 
    ON ws.IsOffMarket = 0
    --AND ws.Inventory > 0 /*小于0的,忽略*/

    AND wd.WarehouseId = ws.WarehouseId

WHERE wd.IsDelete = 0
    AND (0 = ISNULL(@districtId, 0) OR wd.DistrictId = @districtId)
GROUP BY DistrictId, ProductId

 

转载于:https://www.cnblogs.com/Pupa/p/4672844.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值