SQL Server。使用sum得到内部连接中的零

时间:2016-05-20 20:09:00

标签: sql-server

我有这张桌子:

PRODUCTS(product_id, name, price)
(1,'Apple', $10)
(2,'Cherry', $20)
(3,'Watermelon', $30)

而且:

STOCK(product_id, number)
(1,5)
(1,3)
(2,5)

有了这个:

SELECT
  PRODUCTS.product_id,
  SUM(STOCK.number),
FROM
  STOCK
  INNER JOIN PRODUCTS ON PRODUCTS.product_id = STOCK.product_id
GROUP BY
  PRODUCTS.product_id

我可以得到这个:

(Apple, 8)
(Cherry, 5)

但我希望得到这个:

(Apple, 8)
(Cherry, 5)
(Watermelon, 0)

这可以在MySQL中使用RIGHT JOIN完成,但在SQL Server中没有,关于如何实现这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

您可以使用LEFT JOIN

SELECT
  PRODUCTS.product_id,
  COALESCE(SUM(STOCK.number), 0)
FROM
  PRODUCTS
  LEFT JOIN STOCK ON PRODUCTS.product_id = STOCK.product_id
GROUP BY
  PRODUCTS.product_id

注意: RIGHT JOIN在SQL Server中也可用,语法与MySQL相同。

Demo here

答案 1 :(得分:1)

使用LEFT JOIN,如下所示,并使用ISNULL()来补充没有库存的0。

DECLARE @PRODUCTSTABLE TABLE (product_id INT, name VARCHAR(10), price MONEY)
DECLARE @STOCK TABLE (product_id INT, number INT)
INSERT INTO @PRODUCTSTABLE
VALUES
(1,'Apple', 10),
(2,'Cherry', 20),
(3,'Watermelon', 30)

INSERT INTO @STOCK
VALUES
(1,5),
(1,3),
(2,5)

SELECT P.name, SUM(ISNULL(S.number,0))
FROM @PRODUCTSTABLE P
LEFT JOIN @STOCK S ON P.product_id=S.product_id
GROUP BY P.name