我是发展新手。我在Oracle中有一个名为tbl_sale
的表。我已经将表格结构放在下面,我也准确地说出了我想要的内容。请帮我解决这个问题。我想显示parent = 0;
tbl_sale
ID AMOUNT PARENT
1 100 0
2 125.26 1
3 11 1
4 200 0
5 500 4
6 250 4
7 100 4
8 29 0
期望的输出:
ID AMOUNT PARENT
1 236.26 0
4 1050 0
8 29 0
答案 0 :(得分:1)
这是聚合函数和GROUP BY
的设计目的:
SELECT id, SUM(amount) AS amount, parent
FROM tbl_sale
WHERE parent = 0
GROUP BY id, parent
答案 1 :(得分:1)
您可以通过利用递归CTE
在SQL Server和Oracle中这样做WITH q(id, amount, parent, top_most) AS
(
SELECT id, amount, parent, id
FROM tbl_sale
WHERE parent = 0
UNION ALL
SELECT t.id, t.amount, t.parent, q.id
FROM tbl_sale t JOIN q
ON t.parent = q.id
)
SELECT top_most id, SUM(amount), MIN(parent) parent
FROM q
GROUP BY top_most
示例输出:
| ID | SUM(AMOUNT) | PARENT | |----|-------------|--------| | 1 | 236.26 | 0 | | 4 | 1050 | 0 | | 8 | 29 | 0 |
答案 2 :(得分:0)
您试图根据源数据的顺序求和,这是不保证的并且可能会发生变化。
您需要重新设计tbl_sale
以包含您正在尝试组的行所共有的元素。
tbl_sale_line_tems
ID AMOUNT PARENT sale_id
1 100.00 0 1
2 125.26 1 1
3 11.00 1 1
4 200.00 0 2
5 500.00 4 2
6 250.00 4 2
7 100.00 4 2
8 29.00 0 3
我们现在还可以推断出父项次料品(0)在销售的订单项组中总是具有最低的ID。
select min(ID) as ID
,sum(amount)
,sale_id
from tbl_sale_line_items
group by sale_id;
ID AMOUNT SALE_ID
1 236.26 1
4 1050.00 2
8 29.00 3
答案 3 :(得分:0)
这是另一种方法
SELECT
parent_id,
sum(amount)
FROM
( SELECT
case when ts2.id IS NULL then ts1.id else ts2.id end as parent_id,
ts1.amount
FROM
tbl_sale ts1
LEFT JOIN tbl_sale ts2 ON ( ts1.parent = ts2.id )
)
GROUP BY
parent_id
ORDER BY
parent_id