当查询输出为空时在字段中显示零值
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:
- 更正了代码中的不一致之处;
- 提供了指向 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]
约翰格雷买了多少个手电筒?
这是我需要达到的结果:
到目前为止我有这个:
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 线程 (JOIN
似乎使它对我来说太复杂了。
编辑 1:
- 更正了代码中的不一致之处;
- 提供了指向 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
.
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]