2017-01-12 5 views
0

Я пытаюсь добавить Total в нижней части и, кажется, не понимаю, как я могу получить синтаксис, чтобы показать мне «Total» внизу. Я исчерпал свое время, ища его в Интернете. Мне нужен фрагмент coalesce, потому что мне нужно показать нули для сотрудников без продаж. Я взглянул на эту ссылку, но мне нужен Zero в coalesce.Добавить общую сумму в подзапрос

Add a row for TOTAL in a sql query result

select t2.Employee, coalesce(t1."This Week",0) "This Week" 
from mytable t2 left outer join 
(select case when grouping(Employee) = 1 then 'Total' else Employee end, sum(Sales) "This Week" 
from information 
where Week >= DATE '01/01/2017' and Week < DATE '01/31/2017' 
and LastUpdate >= DATE '01/01/2017' and LastUpdate < DATE '01/31/2017' 
group by Employee with Rollup) t1 
on t1.Employee = t2.Employee 

Результат:

Employee     This Week 

Batman      15 
Penguin      25 
Joker      0 
Bane       5 
Scarecrow     0 
------------------->   45 

Ошибка:

ERROR: syntax error at or near "with" 
LINE 8: group by Employee with Rollup) t1 
+0

Изменить свой 'Группа by' заявление в' Group By Служащий С Rollup' см если это работает –

+0

Вы ищете ['ROLLUP'] (https://www.postgresql.org/docs/devel/static/queries-table-expressions.html). –

+0

Показывает ошибку при С ... –

ответ

1

Вы можете попробовать это с ROLLUP

SELECT coalesce(Employee,'Total'), 
     "This Week" 
FROM 
    (SELECT t2.Employee, 
      coalesce(sum(t1.Sales),0) "This Week" 
    FROM mytable t2 
    LEFT JOIN information t1 ON t1.Employee = t2.Employee 
    AND t1.Week >= DATE '01/01/2017' 
    AND t1.Week < DATE '01/31/2017' 
    AND t1.LastUpdate >= DATE '01/01/2017' 
    AND t1.LastUpdate < DATE '01/31/2017' 
    GROUP BY rollup(t2.Employee) 
) x 
+0

Спасибо vkp за помощь. –

+0

да, это is.i отредактировал его. –

1

Вам не нужен внешний запрос. Кроме того, условия в Week и LastUpdate не относятся к операции объединения; Вы можете переместить их в предложении WHERE (которым PostgreSQL оптимизатор должен сделать себя так или иначе, но таким образом ваш запрос понятнее):

SELECT 
    COALESCE(t2.Employee, 'Total') AS Employee, 
    COALESCE(SUM(t1.Sales), 0) AS "This Week" 
FROM mytable t2 
LEFT JOIN information t1 USING (Employee) 
WHERE t1.Week BETWEEN DATE '01/01/2017' AND DATE '01/31/2017' 
    AND t1.LastUpdate BETWEEN DATE '01/01/2017' AND DATE '01/31/2017' 
GROUP BY GROUPING SETS ((t2.Employee),()); 
+0

Спасибо @ Фабиан, он выдает ошибку при использовании (Employee), говорящей ERROR: столбец «Сотрудник», указанный в предложении USING, не существует в правой таблице. –

+0

А? В вашей информационной таблице нет столбца сотрудника? Почему принятый ответ действительно сработал для вас? : / –

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