2012-12-12 34 views
7

Có cách nào để làm cho hàng đầu tiên khác nhau sau đó phần còn lại, vì vậy nó sẽ hiển thị tổng số các cột thích hợp?PostgreSQL - làm cho hàng đầu tiên hiển thị như tổng số hàng khác

Ví dụ:

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

Có thể thực hiện truy vấn như vậy hoặc nó là chống lại logic của sql? Nó sẽ là như thế này (bỏ qua hàng đầu tiên cho bây giờ):

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

Vì vậy, các hàng đầu tiên sẽ là khác nhau. Nó sẽ hiển thị từ 'tổng' thay vì tên trái cây, và sẽ hiển thị tổng số tiền của một (1 + 1 + 1 = 3), b (2 + 1 + 1 = 4) và c (3 + 2 + 1 = 6) . Có thể làm như vậy không? Cảm ơn

+0

Bạn có thể chỉ đơn giản là "UNION ALL' hai truy vấn (có thể bạn cũng phải truyền giá trị của mình). – dezso

+0

Bản sao có thể có của [Postgres: chọn tổng giá trị và sau đó cộng lại số tiền này] (http://stackoverflow.com/questions/12070855/postgres-select-the-sum-of-values-and-then-sum-this -again) –

Trả lời

17

Bạn có thể tránh một lần quét thứ hai đầy đủ các bảng với một CTE:

PostgreSQL 9.2 Schema:

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 

Kết quả:

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

SQL Fiddle here

+0

Cảm ơn. Điều này thậm chí còn tốt hơn. – Andrius

+0

Cảm ơn. Tôi yêu postgres nhưng câu hỏi này làm cho tôi mong muốn cho ['rollup'] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF55331) mà là một cách tự nhiên hơn rất nhiều làm điều này. –

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

Cảm ơn giải pháp – Andrius

7

This is now possible in version 9.5 of Postgres:

PostgreSQL 9,5 Schema

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

Query

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

Kết quả

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

ROLLUP này tương đương với việc sử dụng một biểu thức với GROUPING SETS:

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

Mỗi sublist trong GROUPING SETS được hiểu theo cùng một cách như thể nó đã được trực tiếp trong GROUP BY cl ause.

Các vấn đề liên quan