有三个表格:
customers
products
sales
。每个销售条目都有customer_id
和product_id
。
我需要SELECT
和SUM
sales.value
和customers.id
的每个组合products.id
。重点是:在sales
表中,并非每个组合都存在,所以我希望这些组合在结果中的总和等于零。
http://sqlfiddle.com/#!9/0f37a/2
这个小提示显示了结果应该如何,但我不能包含不存在的组合的行,并且应该总和0.例如:
存在customer_id 1和product_id 1,2和4的组合,而不是customer_id 1和product_id 3.我想要包含一个具有此组合的行,sum(value)= 0。
修改
我有一个包含customer_id和product_id的每个排列的表。
答案 0 :(得分:3)
您可以尝试在CROSS JOIN
和customers
表之间执行products
以获取所有组合,然后将该结果加入sales
:
SELECT c.id AS customer_id, p.id AS product_id,
COALESCE(CAST(s.value AS CHAR(6)), 'NA') AS value
FROM customers c
INNER JOIN products p
LEFT JOIN sales s
ON c.id = s.customer_id AND p.id = s.product_id
ORDER BY c.id, p.id
请注意,MySQL中的CROSS JOIN
相当于执行INNER JOIN
而没有ON
条件。
以下链接是您使用上述查询更新的小提琴。
答案 1 :(得分:0)
看看这是否适合你。(用 MS SQLServer语法编写,但它应该关闭)
DECLARE @Cust TABLE (CID INT, CName VARCHAR(5))
INSERT INTO @Cust VALUES
(1, 'C1' ) ,
(2, 'C2' )
DECLARE @Prod TABLE (PID INT, PName VARCHAR(5))
INSERT INTO @Prod VALUES
(1, 'P1' ) ,
(2, 'P2' ) ,
(3, 'P3' ) ,
(4, 'P4' )
DECLARE @Sales TABLE (CID INT, PID INT, Value INT )
INSERT INTO @Sales VALUES
(1, 1 , 10 ) ,
(1, 2 , 20 ) ,
(1, 4 , 30 )
Select C.CID, P.PID, Sum(ISNULL(S.Value,0)) as Amt -- IFNULL in MySQL
from
@Cust C Cross Join @Prod P
Left Outer JOIN @Sales S ON C.CID = S.CID AND P.PID = S.PID
Group By C.CID, P.PID
Order By 1