2013-12-22 114 views
1

我是新開發的。我在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

解釋一下你的輸出表列的,什麼是你的目標? – Haji

+0

你能解釋一下你的報告應該怎麼做?這只是沒有任何意義,你是否想要平均,平均,你想做什麼? –

+0

我明白了,父母的身份證號碼的和。因此對於ID 1,它的總和爲100 + 125.6 + 11 –

回答

1

你可以做這樣兩在SQL Server和Oracle中通過利用遞歸CTE

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 | 

這裏是SQLFiddle演示(甲骨文
這裏是SQLFiddle演示(SQL服務器

+0

非常感謝。它正在工作.. – user3085540

1

這就是聚合函數和GROUP BY是專爲:

SELECT id, SUM(amount) AS amount, parent 
FROM  tbl_sale 
WHERE parent = 0 
GROUP BY id, parent 
+0

這不會產生預期的結果。 – peterm

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 
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