1

表データ:

NAME     RS
A        10
A        20
A        30
B        15 
B        5
B        10
C        70
C        30 

期待される出力:

A   -- column name
10
20
30
60  -- total of A

B
15
5
10 
30  -- total of B

C
70
30
100 -- total of C

これまでのところ、私は試しました:

  1. UNION ALL
  2. すべてのデータを選択し、フロント エンドで操作します。

なしで他の最も簡単な解決策はありますUNION ALLか?

4

4 に答える 4

1

プレーン SQL を使用して単一のクエリでそれを行うには、次のようにします。

SELECT unnest(arr)
FROM  (
   SELECT ARRAY[name] || array_agg(rs::text) || sum(rs)::text AS arr
   FROM   tbl
   GROUP  BY name
   ) sub
ORDER  BY arr[1];

@WingedPantherが投稿したものと似ていますが、どの名前でもクリーンで安全です。

戻り値:

A
10
20
30
60
B
15
15
C
70
30
100

または:

WITH cte AS (
   SELECT name, sum(RS)::text AS sum_rs
   FROM   tbl
   GROUP  BY 1
   )
SELECT unicol
FROM  ( 
   SELECT name AS unicol, name AS order1, 1 AS order2 FROM cte
   UNION  ALL
   SELECT sum_rs, name, 2 FROM cte
   ) sub
ORDER  BY order1, order2;

戻り値:

A
60
B
15
C
100

SQL フィドル。

または、CTE から結果を送信するだけで、残りはクライアントで行います。

于 2015-01-21T11:35:25.547 に答える
1

これを試して

select  unnest(string_to_array( name ||','||rs||','||sum, ',')) AS elem 
from (
     select name
           ,string_agg(rs::text,',')  rs
           ,sum(rs) 
     from tbl 
     group by name
)t 

結果に印刷Total Ofする場合は使用します

select  unnest(string_to_array( name ||','||rs||','||sum, ',')) AS elem 
from (
     select name
           ,string_agg(rs::text,',')  rs
           ,'Total Of '||name||' '|| sum(rs) sum
     from tbl 
     group by name
)t 

>SQLFIDDLE

于 2015-01-21T11:51:24.753 に答える