2013-12-22 2 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. поэтому для ID 1 это сумма 100 + 125,6 + 11 –

ответ

1

Вы можете сделать это таким образом, как в SQL Server и Oracle, используя re скорописи КТР

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 демо (Oracle)
Вот SQLFiddle демо (SQL Server)

+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) всегда имеет наименьшую идентификатор в пределах группы позиций для продажи.

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 
Смежные вопросы