2016-10-11 5 views
2

CREATE TABLE ВРЕМЕННОГОКак я могу получить общую сумму каждого столбца?

CREATE TEMP TABLE total(
gid SERIAL, 
zoom smallint NOT NULL, 
point integer NOT NULL, 
size integer NOT NULL 
); 

ВСТАВКА ДАННЫЕ

INSERT INTO total(zoom, point, size) VALUES(9,51,21); 
INSERT INTO total(zoom, point, size) VALUES(9,75,45); 
INSERT INTO total(zoom, point, size) VALUES(9,74,34); 
INSERT INTO total(zoom, point, size) VALUES(10,75,4); 
INSERT INTO total(zoom, point, size) VALUES(10,72,63); 
INSERT INTO total(zoom, point, size) VALUES(10,85,22); 

ПОДСЧЕТ ТОЧЕК, сложение, задаваемые на основе ZOOM

SELECT zoom, 
     count(*) AS point, 
     SUM(size) AS size 
FROM total 
GROUP BY zoom 
ORDER BY zoom; 

Результат:

zoom | point | size 
------+-------+------ 
    9 |  3 | 100 
    10 |  3 | 89 
(2 rows) 

ВОПРОС

Как я могу вернуть общее количество каждого столбца?

Wanted результат:

zoom | point | size 
------+-------+------ 
    9 |  3 | 100 
    10 |  3 | 89 
------+-------+------   
Total |  6 | 189 
+1

Несвязанные, но: не используйте строковые литералы для чисел: '' 9'' - это строка. '9' - это номер –

+0

@a_horse_with_no_name Я всегда забываю об этом, спасибо, что напомнил мне. Я сделал исправление. –

+2

Вы застряли в несколько устаревшей версии 9.3? В 9.5 вы можете просто «group by rollup (zoom)» –

ответ

3

Способ имитации накопительного пакета, чтобы просто запустить второй запрос, который делает накопительный пакет. Однако все значения в столбце должны иметь одинаковый тип данных. Как вы хотите, чтобы отобразить метку 'Total' вам нужно преобразовать число zoom из базового запроса к тексту, а также:

Но, как вы хотите рода по фактической стоимости увеличения, вы также должны держать целое число значение в результате.

sort_order необходимо, чтобы убедиться, что строки из первой части союза фактически оставаться «на вершине»

select zoom, point, size 
FROM (
    SELECT zoom::text as zoom, 
     zoom as zoom_value, 
     count(*) AS point, 
     SUM(size) AS size, 
     1 as sort_order 
    FROM total 
    GROUP BY zoom 
    UNION ALL 
    SELECT 'Total', 
     null, 
     count(*) AS point, 
     SUM(size) AS size, 
     2 as sort_order 
    FROM total 
) t 
order by sort_order, zoom_value; 

Это возвращает:

zoom | point | size 
------+-------+----- 
9  |  3 | 100 
10 |  3 | 89 
Total |  6 | 189 

С вверх вы можете сделать следующее:

SELECT case when grouping(zoom) = 1 then 'Total' else zoom::text end, 
     count(*) AS point, 
     SUM(size) AS size 
FROM total 
GROUP BY rollup (zoom) 
order by zoom; 
+0

Большое спасибо за ответ и за объяснение! Это работает как шарм. Я также попробую включить версию для версии v.9.5.! –

-1
SELECT 
zoom, 
SUM(point) AS point, 
SUM(size) AS size 
FROM 
(
SELECT zoom, 
     count(*) AS point, 
     SUM(size) AS size 
FROM total 
GROUP BY zoom 
) x 
ORDER BY zoom 
+0

Это возвращает точно такой же результат, что и запрос в вопросе: http://rextester.com/TDD68340 –

+0

Спасибо за внимание, но это не возвращает Total row of columns! –

+0

Я считаю, что это потому, что я использовал группу. Без группы я считаю, что она должна работать. Код отредактирован. – NonProgrammer

Смежные вопросы