存在NULL条目的分组

时间:2011-12-05 12:41:25

标签: mysql

我正在尝试连接两个表(购买和购买属性),然后根据连接进行分组,但是在连接期间会生成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语句中,但是我似乎无法得到正确的结果。

有什么想法吗?提前谢谢。

3 个答案:

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

道歉读者,这是我的错误。我在问题中写的答案(我认为是错误的),实际上工作得很好 - 在我实际的,更复杂的陈述中的一些其他代码导致它失败。

我为浪费任何人的时间而道歉。