2015-10-07 84 views
3

我試圖讓我的查詢的輸出如下,請幫我與小計保持正確的順序

partno value  value1 phaseid 
ABCD  10  11  A 
ABCD  11  12  B 
Subtotal 21  23  
DEFG  20  21  C 
Subtotal 20  21 
IJKL  30  31  A 
IJKL  31  32  D 
Subtotal 61  63 


CREATE TABLE test_table 
(
    partno text, 
    value bigint, 
    value1 bigint, 
    phaseid text 
) 

INSERT INTO test_table(
      partno, value, value1, phaseid) 
    VALUES ('ABCD', 10, 11, 'A'),('ABCD', 11, 12, 'B'),('DEFG', 20, 21, 'C'),('IJKL', 30, 31, 'A'), 
    ('IJKL', 31, 321, 'D'); 

選擇下面的行是查詢我使用

Select a.partno,a.value,a.value1,b.phaseid 
from (
select partno,value,value1 from test_table a 
Union all 
Select 'Subtotal',Sum(value),sum(value1) from test_table a 
Group By partno 
) as a 
Left Join test_table b USING (partno) 
order by value,value1 

enter image description here

+0

但 'ABCD', 'DEFG' 和 'IJKL' 是不固定的。可能有多個partno的各種值 –

回答

3

試試這個簡單的查詢:

select partno, value, value1, phaseid 
from test_table a 
union all 
select partno || ' Subtotal', sum(value), sum(value1), null 
from test_table a 
group by 1 
order by 1, 4 

    partno  | value | value1 | phaseid 
---------------+-------+--------+--------- 
ABCD   | 10 |  11 | A 
ABCD   | 11 |  12 | B 
ABCD Subtotal | 21 |  23 | 
DEFG   | 20 |  21 | C 
DEFG Subtotal | 20 |  21 | 
IJKL   | 30 |  31 | A 
IJKL   | 31 |  32 | D 
IJKL Subtotal | 61 |  63 | 
(8 rows) 

如果你想有Subtotal而不是ABCD Subtotal

select 
    case when strpos(partno, 'Subtotal') > 0 then 'Subtotal' else partno end partno, 
    value, value1, phaseid 
from (
    select partno, value, value1, phaseid 
    from test_table a 
    union all 
    select partno || ' Subtotal', sum(value), sum(value1), null 
    from test_table a 
    group by 1 
    order by 1, 4 
    ) sub 

    partno | value | value1 | phaseid 
----------+-------+--------+--------- 
ABCD  | 10 |  11 | A 
ABCD  | 11 |  12 | B 
Subtotal | 21 |  23 | 
DEFG  | 20 |  21 | C 
Subtotal | 20 |  21 | 
IJKL  | 30 |  31 | A 
IJKL  | 31 |  32 | D 
Subtotal | 61 |  63 | 
(8 rows) 
+0

感謝它的工作。 –