当查询输出为空时在字段中显示零值

Display zero value in field when query output is null

约翰格雷买了多少个手电筒?

这是我需要达到的结果:

到目前为止我有这个:

IF NOT (EXISTS (SELECT 
        c.[customerid],
        c.[firstname], 
        c.[lastname],
        cp.[quantity]
    FROM [dbo].[customers] AS c 
    INNER JOIN [dbo].[Customer_Purchases] AS cp
    ON c.[customerid] = cp.[customerid]
    WHERE 
        c.[customerid] = 10101
        AND cp.[item] = 'Flashlight'
    GROUP BY 
        c.[customerid],
        c.[firstname], 
        c.[lastname],
        cp.[quantity]
    )
)BEGIN
    SELECT
        c.[customerid] AS ID,
        c.[firstname] AS First Name, 
        c.[lastname] AS Last Name,
        'Flashlight' AS Item,
        '0' As Quantity
    FROM [dbo].[customers] AS c
    WHERE 
        c.[customerid] = 10101
    GROUP BY 
        c.[customerid],
        c.[firstname], 
        c.[lastname]
END

更实用的方法是什么?

我已经通过几个关于此类问题的 SO 线程 (, , and ),但是必要的 JOIN 似乎使它对我来说太复杂了。

编辑 1:

  1. 更正了代码中的不一致之处;
  2. 提供了指向 SO 线程的超链接。

How many flashlights did John Gray buy?

只需使用left join:

SELECT c.[customerid], c.[firstname], c.[lastname], 
       COALESCE(SUM(cp.quantity), 0)
FROM dbo.customers c LEFT JOIN
     dbo.Customer_Purchases cp
     ON c.customerid = cp.customerid AND
        cp.item = 'flashlight'
WHERE c.customerid = 10101
GROUP BY c.[customerid], c.[firstname], c.[lastname];

注意:您不想按数量聚合。据推测,您想要将手电筒的所有数量相加。手电筒(但不是客户)的过滤需要在 ON 子句中,因为购买是 LEFT JOIN.

中的第二个 table
SELECT c.[customerid], c.[firstname], c.[lastname],
       sum(case when cp.item = 'flashlight' then cp.quantity else 0 end)
FROM dbo.customers AS c 
LEFT JOIN dbo.Customer_Purchases AS cp ON c.customerid = cp.customerid
WHERE c.customerid = 10101
GROUP BY c.[customerid], c.[firstname], c.[lastname]