2012-12-12 13 views
7

क्या पहली पंक्ति को अलग करने के लिए कोई तरीका है, तो बाकी यह उचित स्तंभों का कुल योग दिखाएगा?PostgreSQL - पहली पंक्ति को अन्य पंक्तियों के रूप में दिखाएं

उदाहरण के लिए:

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

ऐसा क्वेरी बनाने के लिए संभव है या यह एसक्यूएल के तर्क के खिलाफ है? यह इस तरह होगा (अब के लिए पहली पंक्ति अनदेखी):

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

तो पहली पंक्ति अलग होगा। यह फल नाम के बजाय 'कुल' शब्द दिखाएगा, और कुल योग (1 + 1 + 1 = 3), बी (2 + 1 + 1 = 4) और सी (3 + 2 + 1 = 6) दिखाएगा । क्या ऐसा करना संभव है? धन्यवाद

+0

आप केवल दो प्रश्नों को 'यूनियन ऑल' कर सकते हैं (शायद आपको अपने मूल्य भी डालना होगा)। – dezso

+0

[पोस्टग्रेस का संभावित डुप्लिकेट: मानों का योग चुनें और फिर इसे दोबारा जोड़ दें] (http://stackoverflow.com/questions/12070855/postgres-select-the-sum-of-values-and-then-sum-this -गैन) –

उत्तर

17

आप एक CTE के साथ तालिका के एक दूसरे पूर्ण स्कैन से बचने कर सकते हैं:

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 | 

एसक्यूएल फिडल here

+0

धन्यवाद के लिए धन्यवाद। यह भी बेहतर है। – Andrius

+0

धन्यवाद। मुझे पोस्टग्रेस पसंद है लेकिन यह सवाल मुझे ['रोलअप'] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF55331) की इच्छा बनाता है जो कि एक और अधिक प्राकृतिक तरीका है यह कर रहा हूं। –

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

समाधान – Andrius

7

This is now possible in version 9.5 of Postgres:

PostgreSQL 9.5 स्कीमा

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

क्वेरी

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

परिणाम

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

यह ROLLUPGROUPING SETS के साथ एक अभिव्यक्ति का उपयोग करते के बराबर है:

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

GROUPING SETS में प्रत्येक sublist हालांकि के रूप में एक ही तरह से व्याख्या की है यह सीधे ग्रुप बीएल में थे ause।

संबंधित मुद्दे