聚合两个表的每个排列

时间:2016-07-03 23:05:42

标签: mysql

有三个表格:

  • customers
  • products
  • sales

每个销售条目都有customer_idproduct_id

我需要SELECTSUM sales.valuecustomers.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的每个排列的表。

2 个答案:

答案 0 :(得分:3)

您可以尝试在CROSS JOINcustomers表之间执行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条件。

以下链接是您使用上述查询更新的小提琴。

SQLFiddle

答案 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