Postgresql: Как сложить один числовой столбец c для всех строк в нижней части записей SELECT? - PullRequest
0 голосов
/ 30 января 2020
  • Система: Postgresql 9.6
  • Я использую psql 7.4.6 в Windows 7 cmd.exe для выполнения запроса

У меня есть уже искал с помощью поисковой системы, и на stackoverflow, и еще не нашел ответа.

Я хотел бы показать все записи в этом запросе SELECT, а затем сложить вычисленный столбец с именем «hrs» в нижней части отображаемых записей. Группировка по dcmasterid и показ суммы «hrs» для каждого dcmasterid были бы хорошими, так как в некоторых случаях я мог бы показывать несколько значений dcmasterid в SELECT.

Я учусь лучше всего, просматривая код и выделяя его, а не просмотрев дюжину примеров, которые действительно не относятся ко мне. Сожалею. Плюс я знаю, что есть больше чем один способ сделать вещи.

Я пробовал некоторые из этих методов:

SELECT  dcmasterid as empid, ROUND(jcacthours::numeric,2) as hrs, 
jcstartdate as sdate, ccmasterid as job 
FROM jobcost 
WHERE (jcstartdate BETWEEN '2020-01-26' AND '2020-02-01') AND (jcacthours <> 0)  
AND (dcmasterid IN ('CHURO', 'JSMITH', 'RJONES')) 
GROUP BY ccmasterid, jcacthours, dcmasterid, jcstartdate, 
ROLLUP (ccmasterid, dcmasterid, jcacthours, hrs) 
ORDER BY dcmasterid, jcstartdate;

, и это

SELECT  dcmasterid as empid, ROUND(jcacthours::numeric,2) as hrs, 
jcstartdate as sdate, ccmasterid as job 
FROM jobcost 
WHERE (jcstartdate BETWEEN '2020-01-26' AND '2020-02-01')  AND (jcacthours <> 0)  
AND (dcmasterid='CHURO') 
GROUP BY GROUPING SETS ((jobcost.ccmasterid, jobcost,dcmasterid, 
  jobcost.jcstartdate, jobcost.jcacthours)) 
ORDER BY dcmasterid, jcstartdate;

Обычно я получаю сообщение об ошибке, что поле отсутствует в предложении GROUP BY или сумма в нижней части отображаемых записей просто не отображается, поэтому, очевидно, я не понимаю, как это использовать. Я не делаю много SQL. Я еще не нашел тутуриал, который говорит медленно. Мне не нужно делать каких-либо сложных группировок на этом этапе. Мне нравились книги О'Рейли, потому что они часто меняли только одну вещь между каждым шагом, так что было легче набирать asp концепций по мере добавления новых концепций.

Я также пробовал это:

SELECT  dcmasterid as empid, ROUND(jcacthours::numeric,2) as hrs, 
jcstartdate as sdate, ccmasterid as job 
FROM jobcost 
WHERE (jcstartdate BETWEEN '2020-01-26' AND '2020-02-01')  
AND (jcacthours <> 0)   
GROUP BY empid WITH ROLLUP  
LIMIT 50;

, но получаю "синтаксическую ошибку при WITH", поэтому я предполагаю, что Postgresql не поддерживает WITH таким образом.

Может кто-нибудь пролить свет на то, как это сделать? Кажется, это должно быть общей задачей.

Резюме: Я хотел бы суммировать только один столбец, "hrs", для всех записей, выбранных и отображенных.

Большое спасибо!

РЕДАКТИРОВАТЬ: Хорошо, я получил это на работу. У меня было слишком много ненужных столбцов в моем оригинальном SQL.

SELECT  dcmasterid as empid, SUM(ROUND(jcacthours::numeric,2)) as hrs, 
SUBSTRING(ccmasterid FROM 1 FOR 8) as job 
FROM jobcost 
WHERE (jcstartdate BETWEEN '2020-01-26' AND '2020-02-01')  
AND (jcacthours <> 0)  AND (dcmasterid='CHURO')  
GROUP BY GROUPING SETS ((empid), (ccmasterid)) ;
...