我有一个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。
答案 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
(这比使用空字符串更好),但您可以将其更改为''
。