2012-12-12 9 views
7

Czy istnieje sposób na odróżnienie pierwszego wiersza od reszty, aby wyświetlić całkowitą sumę odpowiednich kolumn?PostgreSQL - tworzenie pierwszego wiersza jako całości innych wierszy

Na przykład:

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

Czy to możliwe, aby tak zapytania lub jest to niezgodne z logiką SQL? Byłoby tak (ignorując pierwszy rząd na razie):

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

Więc pierwszy rząd będzie inaczej. Wyświetliłoby słowo "ogółem" zamiast nazwy owocu i pokaże całkowitą sumę (1 + 1 + 1 = 3), b (2 + 1 + 1 = 4) i c (3 + 2 + 1 = 6) . Czy można to zrobić? Dzięki

+0

Możesz po prostu "UNION ALL" dwa zapytania (prawdopodobnie musisz również rzucić swoje wartości). – dezso

+0

Prawdopodobny duplikat [Postgres: wybierz sumę wartości, a następnie zsumuj to ponownie] (http://stackoverflow.com/questions/12070855/postgres-select-the-sum-of-values-and-then-sum-this -again) –

Odpowiedz

17

Można uniknąć drugi pełny skan tabeli z CTE:

PostgreSQL 9.2 Schemat:

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); 

Query:

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 

Wyniki:

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

SQL Fiddle here

+0

Dzięki. To jest jeszcze lepsze. – Andrius

+0

Dzięki. Uwielbiam postgreSy, ale to pytanie sprawia, że ​​chciałbym ['rollup'] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF55331), który jest o wiele bardziej naturalnym sposobem robiąc to. –

5
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 
+0

Dzięki za rozwiązanie – Andrius

7

This is now possible in version 9.5 of Postgres:

PostgreSQL 9,5 schematu

CREATE TABLE basket(fruits text, a integer, b integer, c integer); 
CREATE TABLE 
INSERT INTO basket(fruits, a, b, c) values('apples', 1, 1, 1), 
             ('apples', 0, 1, 2), 
             ('bananas', 1, 1, 2), 
             ('oranges', 1, 1, 1); 

Zapytanie

SELECT coalesce(fruits,'total'), sum(a) a, sum(b) b, sum(c) c 
FROM basket 
GROUP BY ROLLUP((fruits)) 

Wyniki

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

Ten ROLLUP jest równoznaczne z użyciem wyrażeń z GROUPING SETS:

SELECT fruits, sum(a) a, sum(b) b, sum(c) c 
FROM basket 
GROUP BY GROUPING SETS (fruits,()) 

Każdy podlistę w GROUPING SETS jest interpretowane w ten sam sposób, jak gdyby był bezpośrednio w GRUPIE PRZEZ KL ause.

Powiązane problemy