2017-09-14 10 views
0

と、私は次のクエリを持っている:Postgresの - 選択レコードのリストと、1行合計

field_a | field_b | total 
----------------------- 
val1 | val2 | 100 
val3 | val4 | 100 

それは次のようになります合計を仮定し

with charges as (
    select some_fields, (sum(subtotal_cents) as total from my_table 
    where <condition> 
    group by some_field 
) 
select <some_fields>, charges.total 
from my_table 
<lots_of_joins!> 
left join charges on <condition> 
where <condition> 

が、これは私に次のような出力を与え、100でした代わりに、この(またはそれに近い)のようなものを得ることが可能:

field_a | field_b | total 
----------------------- 
val1 | val2 | 
val3 | val4 | 
total |   | 100 

答えて

0

はい、ものによってUNIONといくつかのトリッキーな順序を使用することにより、 :ここ

with charges as (
    select some_fields, (sum(subtotal_cents) as total from my_table 
    where <condition> 
    group by some_field 
) 
SELECT * 
FROM 
    (
     select <some_fields>, CAST(NULL AS INTEGER) AS TOTAL, 0 AS sortorder 
     from my_table 
     <lots_of_joins!> 
     UNION ALL 
     SELECT 'total' as field_a, NULL as some_fields_2, NULL as some_fields_3, ..., charges.total, 1 as sortorder 
    ) 
ORDER BY sortorder; 

重要なものは以下のとおりです。我々は2つのクエリの結果(クエリ結果とあなたのCTE結果)

  • は、フィールドが間に並ばなければなりませんを積層するUNIONを使用している

    1. 序数と型の両方で2つのUnion'dクエリがなければ、エラーが発生します。
    2. ソート順に新しい列を追加し、獣全体をサブクエリに移動してからsortorderフィールドをORDER BYして、CTEの結果がUNIONの結果の最下部に表示されるようにします。
  • 0

    はい、GROUPING SETSを使用します。 official documentationではあまり例はありませんが、a,btotalの3つの列を持つ表があるとします。

    あなたにこの取得することにより、簡単なグループ:SQLはSELECT a, b, SUM(total) FROM foo GROUP BY GROUPING SETS ((a, b))と同等です

    # SELECT a, b, SUM(total) FROM foo GROUP BY a, b; 
        a | b | sum 
    ------+------+----- 
    val1 | val2 | 100 
    val3 | val4 | 100 
    

    に。

    # SELECT a, b, SUM(total) FROM foo GROUP BY GROUPING SETS ((a, b)); 
        a | b | sum 
    ------+------+----- 
    val1 | val2 | 100 
    val3 | val4 | 100 
    
    # SELECT a, b, SUM(total) FROM foo GROUP BY GROUPING SETS ((a, b),()); 
        a | b | sum 
    ------+------+----- 
    val1 | val2 | 100 
    val3 | val4 | 100 
         |  | 200 
    

    もちろん、あなたがより複雑なユースケースのためにこれを調整する必要がありますが、それはかなり簡単でなければなりません:グループが総全体的に取得するためにセットのあなたは、そのリストに追加することができます。

    編集:私は簡単な例文でsqlfiddleを作成しました。

    関連する問題