我正在尝试连接两个表(购买和购买属性),然后根据连接进行分组,但是在连接期间会生成NULL值,因为表A中的每个条目都不具有表B中对应的“属性” - 然后这会杀死我的'小组'。
我的实际实现比这更复杂,但这里是我想要实现的修剪概念:
我有以下表格:
购买:
|purchase_id | products_id | qty |
| 1 | 10 | 100 |
| 2 | 11 | 100 |
| 3 | 10 | 300 |
| 4 | 12 | 50 |
purchase_attributes:
|purchase_attributes_id | purchase_id | options_id |
| 1 | 1 | 5 |
| 2 | 3 | 5 |
| 3 | 4 | 5 |
现在,我的目标是计算特定产品的总数量,按options_id分组。 所以,我有以下sql:
select products_id, options_id, SUM(qty)
from purchases
left join purchase_attributes using(purchase_id)
group by products_id, options_id
适用于purchase_attributes表中列出purchase_id的所有情况,但对于purchase_id 2中未出现在purchase_attributes中的情况,它不会显示在我的结果集中。
示例结果集:
| products_id | options_id | SUM(qty) |
| 10 | 5 | 400 |
| 12 | 5 | 50 |
但是我想收到以下结果集:
| products_id | options_id | SUM(qty) |
| 10 | 5 | 400 |
| 11 | NULL | 100 |
| 12 | 5 | 50 |
我已经尝试了一些东西,包括Coalesce在group by和Union(ing)两个select语句中,但是我似乎无法得到正确的结果。
有什么想法吗?提前谢谢。
答案 0 :(得分:1)
确实会产生您想要的结果。
SELECT products_id,options_id,SUM(qty)
FROM (SELECT 1 AS purchase_id,10 AS products_id,100 AS qty
UNION ALL
SELECT 2,11,100
UNION ALL
SELECT 3,10,300
UNION ALL
SELECT 4,12,50) purchases
LEFT JOIN (SELECT 1 AS purchase_attributes_id,1 AS purchase_id,5 AS
options_id
UNION ALL
SELECT 2,3,5
UNION ALL
SELECT 3,4,5) purchase_attributes USING(purchase_id)
GROUP BY products_id,options_id
请提供一个实际演示您的问题的示例。
答案 1 :(得分:0)
注意:我现在无法尝试使用此代码,只是将其掀起..所以请先测试一下..
SELECT p.products_id, pa.options_id
, SUM(qty) AS sum_qty
FROM purchases AS p
LEFT JOIN purchase_attributes AS pa
ON p.purchase_id = pa.purchase_id
GROUP BY p.products_id, pa.options_id
如果它不起作用,请告诉我,结果是什么......
答案 2 :(得分:0)
道歉读者,这是我的错误。我在问题中写的答案(我认为是错误的),实际上工作得很好 - 在我实际的,更复杂的陈述中的一些其他代码导致它失败。
我为浪费任何人的时间而道歉。