2013-05-14 78 views
1

我有一个表,列出发票总额是我们集团在一年以下如果在连接表中不存在匹配的记录,将表分组?

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的链接列表

我需要根据天气对发票进行分组或不发货,因此我需要对事实进行分组,以确定是否存在具有匹配的supplierID的产品

这是我进入卡住的地方,当我运行结合im卡住关于如何根据supplierID字段为空或不为空进行分组?

还有一些发票是针对多个产品我如何确保我没有在发票表中创建多个记录?

+0

您能否提供供应商和产品所提及的表格和栏目的定义? – 2013-05-14 11:12:56

+0

给你的schema.Use(http://sqlfiddle.com/)。 – 2013-05-14 11:23:24

回答

0

假设你的供应商ID列称为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 

说明:为了做到这一点,你需要离开加盟Products表,分组通过发票编号。产品ID的计数将返回0或> 0,如果有匹配的产品或没有。

我们把它放在一个子查询中,因为我们不希望产品与外部分组混合计数,如果在某些情况下每个发票有多个产品(如:许多产品具有相同的供应商ID)。

+0

请注意,这只会返回给供应商的这些金额的总和,而不是针对那些有和没有的金额的单独计数。 – 2013-05-14 11:01:42

+0

糟糕,我误解了这个问题。修改查询,以便它能做他想做的事。 – 2013-05-14 11:06:54

+0

然后把它清理一下......应该现在就工作。 – 2013-05-14 11:11:39

相关问题