按组对所有子组的最后一个值求和

时间:2015-10-28 03:32:51

标签: sql oracle

考虑下表:

ID | ITEM | GROUP_ID | VAL       | COST 
---+------+----------+-----------+-------
1  |  A   | 1        | 1         | 12     
2  |  B   | 1        | 2         | 12       
3  |  C   | 1        | 3         | 12    
4  |  D   | 1        | 4         | 13      
5  |  D   | 1        | 5         | 12    
6  |  E   | 2        | 1         | 17      
7  |  E   | 2        | 2         | 10     
8  |  E   | 2        | 3         | 11       
9  |  E   | 2        | 4         | 12      
10 |  F   | 2        | 5         | 15       
11 |  F   | 2        | 6         | 13      
12 |  F   | 2        | 7         | 11      
13 |  F   | 2        | 8         | 12  

如何得到如下结果:

 GROUP_ID | VAL       | COST 
----------+-----------+-------
 1        | 15        | 48     
 2        | 36        | 24    

val是组ID的总和 成本是项目的最后一个值的总和。

2 个答案:

答案 0 :(得分:1)

试试这个

<p align="justify"></p>

修改 SQL Fiddle Demo

感谢@Juan Carlos Oropeza创建SQL Fiddle测试数据

答案 1 :(得分:1)

在postgres,oracle或sql server上使用分析函数ROW_NUMBER()

<强> SqlFiddleDemo

WITH last_item as (    
    SELECT group_id, sum(cost) as sum_cost
    FROM (
        SELECT t.*,
               ROW_NUMBER() over (partition by item order by id desc) as rn 
        FROM Table1 t
        ) as t
   WHERE rn = 1
   GROUP BY t.group_id
), 
val_sum as (
    SELECT t.group_id, SUM(val) as sum_val
    FROM Table1 t
    GROUP BY t.group_id
)
SELECT v.group_id, v.sum_val, l.sum_cost
FROM val_sum v
INNER JOIN   last_item l
ON v.group_id = l.group_id

输出

| group_id | sum_val | sum_cost |
|----------|---------|----------|
|        1 |      15 |       48 |
|        2 |      36 |       24 |