如果连接表中没有匹配的记录,请对表进行分组?

时间:2013-05-14 10:55:31

标签: mysql

我有一张表格,其中列出了我们将年份分组为总计的发票,其中包含以下内容

SELECT
  sum(totalValue/((100 + Vat)/100)) AS purchases ,
  year(invoice_date) AS invoiceyear
FROM invoices
GROUP BY year(invoice_date)
ORDER BY invoiceyear Desc;

我们还有一个发票表列表,其中包含供应商列表中供应商ID的链接,产品表还包括供应商链接列表

我需要对天气进行分组,或者不是发票是否为库存订单,所以我需要对有或没有匹配的供应商ID的产品进行分组

这就是我陷入困境的时候,当我运行join时,如果supplierID字段为null或者不为null,那么我将如何分组?

另外一些发票适用于多种产品,如何确保我不在发票表中创建多个记录?

1 个答案:

答案 0 :(得分:0)

假设您的SupplierID列名为SupplierID,并且每个表都有一个id列,以下是答案:

SELECT
    SUM(`totalValue` / ((100 + `Vat`)/100)) AS `purchases`,
    `order_type`,
    `invoice_year`
FROM (
    SELECT `i`.*,   
        IF(COUNT(`p`.`id`) = 0, 'custom', 'stock') AS `order_type`,
        YEAR(`i`.`invoice_date`) AS `invoice_year`
    FROM `invoices` AS `i`
    LEFT JOIN `products` AS `p` 
        ON `i`.`SupplierID` = `p`.`SupplierID`
    GROUP BY `i`.`id`
) AS `filtered`
GROUP BY `order_type`, `invoice_year`
ORDER BY `invoice_year` DESC

说明:为了做到这一点,您需要在产品表上保持联接,按发票ID分组。产品ID的计数将返回0或>如果有匹配的产品,则为0。

我们将它放在子查询中是因为我们不希望产品的数量与外部分组混合,如果在某些情况下每个发票有超过1个产品,则会导致数学问题(即许多产品具有相同的供应商ID)。