3

我有一个餐厅数据库,我需要合计所有单独出售的物品的总价值。因此,如果我卖了一个基本价格为 10.00 美元的汉堡包加培根,价格为 1.00 美元,一个汉堡包(同样为 10.00 美元)加鳄梨,价格为 0.50 美元,我需要退回 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。

4

3 回答 3

3
 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 不会有任何其他孩子。

于 2013-09-18T16:59:23.170 回答
1

根据您的问题尚不清楚(请参阅我的评论),但据我了解,一个简单的 group by 将为您提供您想要的。如果不是,请解释(在原始问题中)为什么此查询不起作用 --- 您的要求缺少什么?

SELECT item_num, SUM(price) 
FROM invoices
GROUP BY item_num
于 2013-09-18T17:03:49.873 回答
0

很难说,但看起来你需要递归 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(它比使用空字符串更好的解决方案),但您可以将其更改为''.

于 2013-09-18T17:10:00.073 回答