11

最初の行を残りの行とは異なるものにする方法はありますか?その場合、適切な列の合計が表示されますか?

例えば:

      fruits|a|b|c
       total|3|4|6
      apples|1|2|3
     bananas|1|1|2
     oranges|1|1|1

そのようなクエリを作成することは可能ですか、それともSQLのロジックに反していますか? 次のようになります (最初の行は無視します)。

SELECT fruits, sum(a), sum(b), sum(c)
FROM basket

したがって、最初の行は異なります。果物の名前の代わりに「合計」という単語が表示され、a (1+1+1=3)、b (2+1+1=4)、c (3+2+1=6) の合計が表示されます。 . そのようにすることは可能ですか?ありがとう

4

3 に答える 3

25

CTE を使用すると、テーブルの 2 回目のフル スキャンを回避できます。

PostgreSQL 9.2 スキーマ:

create table basket(fruits text, a integer, b integer, c integer);
insert into basket(fruits, a, b, c) values('apples', 1, 1, 1),
                                          ('apples', 0, 1, 2),
                                          ('bananas', 1, 1, 2),
                                          ('oranges', 1, 1, 1);

クエリ:

with w as ( select fruits, sum(a) a, sum(b) b, sum(c) c
            from basket
            group by fruits )
select * from w union all select 'total', sum(a), sum(b), sum(c) from w

結果

|  FRUITS | A | B | C |
-----------------------
| bananas | 1 | 1 | 2 |
| oranges | 1 | 1 | 1 |
|  apples | 1 | 2 | 3 |
|   total | 3 | 4 | 6 |

SQLフィドルはこちら

于 2012-12-12T14:27:37.367 に答える
6
SELECT 'total' AS fruits, sum(a), sum(b), sum(c) FROM basket
UNION ALL
SELECT fruits, sum(a), sum(b), sum(c) FROM basket GROUP BY fruits
于 2012-12-12T12:40:23.173 に答える