2012-03-22 43 views
0

我需要以下查询的一些帮助。我相信我这个得太多,但这里有云:如果没有条目存在,则需要使用JOIN来检索总和或RIGHT表中的0

SELECT 
     bc.name, 
     bc.category_id, 
     bc.ref_id, 
     COALESCE(bc.parent_id,bc.category_id) as parent_category_id, 
     (select name FROM budget_categories bc2 WHERE bc2.category_id = bc.parent_id) as parent_name, 
     (select ref_id FROM budget_categories bc2 WHERE bc2.category_id = bc.parent_id) as parent_ref_id, 
     COALESCE(sum(bee.amount),0) as amount 
    FROM 
     budget_expected_expenses bee, budget_categories bc 
    WHERE 
     bc.group_id IN (1,139) AND 
     bee.group_id = 1 AND 
     bee.date BETWEEN '2012-01-01' AND '2012-01-31' AND 
     bee.cat_id = bc.category_id 
    GROUP BY bee.cat_id ORDER BY bc.ref_id ASC 

基本上我们的目标是,以返回“BC”表(无论是否由集团或总部创建的每个类别的总和 - 在这个案例1和139分别来自'蜜蜂'表。如果“蜜蜂”中没有特定组的条目,我需要它返回0.但是,此查询仅返回实际在“蜜蜂”表中具有条目的值的总和。我确定有些东西我失踪了,但是,我错过了它。提前致谢。

注:我试过各种连接,似乎没有任何工作。显然这是可能的,我只是空白。

回答

0

我使用比旧格式的列表表格更新的ANSI样式重写,并在WHERE子句中显式添加连接条件。通过这种方式,您应该更好地了解每个表与其他人的关系以及要应用于这些JOINED元素的显式限制(如日期标准)。 where子句只剩下针对select的第一个表的条件。

我已根据您的意图查找PARENT类别和名称以及参考ID(提供了父ID),向分类表应用了两次连接。如果不是,它会查看找到的默认类别ID。

我想我看到的唯一一个打嗝是加入到预期费用中,其中您的标准仅为group_ID = 1,但您的预算类别标准为1或139(通过in子句)。如果他们在,其实应该是相同的,然后调整加入成为

“AND bc.group_ID = bee.group_ID”

最后,确认你想要什么的...原始类别分组,或者与其相关联的父母,但这也是你的呼叫。

SELECT 
     bc.name, 
     bc.category_id, 
     bc.ref_id, 
     COALESCE(bc.parent_id,bc.category_id) as Which_Category_id, 
     COALESCE(bcParent.Name, bcDefCat.Name) as Category_Name, 
     COALESCE(bcParent.Ref_ID, bcDefCat.Ref_ID) as Category_Ref_ID, 
     COALESCE(sum(bee.amount),0) as amount 
    FROM 
     budget_categories bc 

      LEFT JOIN budget_expected_expenses bee 
       ON bc.category_id = bee.cat_id 
       AND bee.group_ID = 1 
       AND bee.date BETWEEN '2012-01-01' AND '2012-01-31' 

      LEFT JOIN budget_categories bcParent 
       on bc.parent_ID = bcParent.category_ID 

      JOIN budget_categories bcDefCat 
       on bc.Category_ID = bcDefCat.category_ID 
    WHERE 
     bc.group_id IN (1,139) 
    GROUP BY 
     bc.category_id 
    ORDER BY 
     bc.ref_id ASC 
0
FROM budget_expected_expenses bee, budget_categories bc 

如果你想显示在bc但不一定bee,然后做一个LEFT条目JOIN:

FROM budget_categories bc LEFT JOIN budget_expected_expenses bee ON bc.category_id = bee.cat_id 

您还需要组由有保证不为空列:

GROUP BY bc.category_id 

此外,使用交叉连接和复杂的子查询,查询的方式比它需要的复杂得多。你可以把它简化为这样的事情:

SELECT 
    bc.name, 
    bc.category_id, 
    bc.ref_id, 
    COALESCE(bc.parent_id,bc.category_id) as parent_category_id, 
    parent.name as parent_name, 
    parent.ref_id as parent_ref_id, 
    COALESCE(sum(bee.amount),0) as amount 
FROM 
    budget_categories bc 
LEFT JOIN 
    budget_expected_expenses bee ON bc.category_id = bee.cat_id 
LEFT JOIN 
    budget_categories parent ON bc.parent_id = parent.category_id 
WHERE 
    bc.group_id IN (1,139) AND 
    bee.group_id = 1 AND 
    bee.date BETWEEN '2012-01-01' AND '2012-01-31' 
GROUP BY bc.category_id ORDER BY bc.ref_id ASC 
0

建议你重写查询有一个LEFT JOIN:

SELECT 
    .... 
    COALESECE(SUM(bee.amount,0.00)) 
FROM 
    budget_categories bc 
    LEFT JOIN 
    budget_expected_expenses bee ON bee.cat_id = bc.category_id 
WHERE 
    ... 

LEFT JOIN将始终与至少为每一个结果记录结束记录在连接的左侧。如果没有匹配的右手记录,则将使用NULL,这就是为什么您需要COALESCE()将其转化为0.00的原因。

相关问题