子查询select语句中的同一个表

时间:2013-09-18 16:53:35

标签: sql

我有一个resturant数据库,我需要总计单独销售的所有商品的总价值。因此,如果我卖了一个基本价格为10.00美元的汉堡包,其中培根价格为1.00美元,而汉堡包(再次为10.00美元)的价格为0.5美元,我需要返回21.50美元。我的发票表如下所示:

invoice_num item_num  price   item_id   parent_item_id
111         hmbg      10.00   guid_1    ''
111         bacn      1.00    guid_2    guid_2
112         hmbg      10.00   guid_3    ''
112         avcd      0.50    guid_4    guid_3

我可以得到所有父项的总和:

SELECT item_num, SUM(price) FROM invoices WHERE parent_item_id = ''

添加浇头令我感到困惑。我觉得我需要在SUM中添加子查询,但我不知道如何去做,并引用原始查询来使用item_id。

3 个答案:

答案 0 :(得分:2)

 SELECT item_num, sum(i.price) + sum(nvl(x.ingred_price,0))
  FROM invoices i
LEFT OUTER JOIN
     (SELECT parent_item_id
             , sum(price) ingred_price
          FROM invoices
         WHERE parent_item_id IS NOT NULL
       GROUP BY parent_item_id) x
ON x.parent_item_id = i.item_id
WHERE i.parent_item_id IS NULL      
GROUP BY item_num

这是证明上述代码有效的SQL Fiddle。我使用过Oracle,但你应该能够将它适应你正在使用的任何数据库。

假设:父子关系中没有多个级别。例如。 A可以有孩子B,但B不会有其他孩子。

答案 1 :(得分:1)

根据您的问题不明确(请参阅我的评论),但据我了解,一个简单的小组将为您提供您想要的内容。如果没有请解释(在原始问题中)为什么这个查询不起作用---你的要求缺少什么?

SELECT item_num, SUM(price) 
FROM invoices
GROUP BY item_num

答案 2 :(得分:0)

很难说,但看起来你需要recursive cte。 这是PostgreSQL的例子:

with recursive cte as (
    select
        t.invoice_num, t.price, t.item_id, t.item_num
    from Table1 as t
    where t.parent_item_id is null
    union all
    select
        t.invoice_num, t.price, t.item_id, c.item_num
    from Table1 as t
        inner join cte as c on c.item_id = t.parent_item_id
)
select invoice_num, item_num, sum(price)
from cte
group by invoice_num, item_num

<强> sql fiddle demo

我已将null用于空parent_item_id(这比使用空字符串更好),但您可以将其更改为''