PostgreSQL函数进行计算,然后填充一个表

PostgreSQL函数进行计算,然后填充一个表,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我正在寻找一些帮助,我试图在pgAdmin 4中完成一个过程。我有一张叫“销售”的桌子。 属性是; saleId(主键)、saleUnitprice(INT)、saleQuantity(INT)、saleTotal(INT)、saleDate(日期)、prId(产品表外键)、spId(salesperson表外键) 我有第二个名为“saletally”的表,我希望用每个销售人员每月的总销售额填充该表 获取总计的SQL是 SELECT spid, SUM(saletotal) F

我正在寻找一些帮助,我试图在pgAdmin 4中完成一个过程。我有一张叫“销售”的桌子。 属性是; saleId(主键)、saleUnitprice(INT)、saleQuantity(INT)、saleTotal(INT)、saleDate(日期)、prId(产品表外键)、spId(salesperson表外键)

我有第二个名为“saletally”的表,我希望用每个销售人员每月的总销售额填充该表

获取总计的SQL是

SELECT spid, 
       SUM(saletotal) 
FROM public."sales" 
WHERE EXTRACT(MONTH from saledate) = EXTRACT(MONTH from current_date) 
GROUP BY spid;
这将返回每个销售人员及其当月总销售额的一些记录。我正试图弄清楚如何把这些信息放在“saletally”表中

我希望最后能和你在一起

 stID   stTotal   spID    stMonth  
------ --------- ------ ---------- 
 st1        800   sp1    January   
 st2        900   sp2    January   
 st3        900   sp3    January   
 st4        950   sp1    February  
 st5        800   sp2    February  
 st6        950   sp3    February 
我以前没有在SQL中做过这么复杂的事情,我想我需要在PostgreSQL中作为一个函数来做。根据函数的语法,这里是我到目前为止所管理的

CREATE OR REPLACE FUNCTION totalSales ()
RETURNS integer AS $totalsales$
declare
stId_var varchar(4) := stId +1,
stTotal_var := SELECT SUM(saletotal) FROM public."sales" WHERE EXTRACT(MONTH from saledate) = EXTRACT(MONTH from current_date),
spId_var := SELECT spID FROM public.”sales”,
stMonth_var = EXRACT(MONTH from current_date);

BEGIN
Insert INTO public.”salestally”(stId, stTotal, spId, stMonth)
VALUES (stId_var, stTotal_var, spId_var, stMonth_var)
   RETURN totalsales;
END;
$totalsales$ LANGUAGE plpgsql;
我想应该有一个循环。如果有人能在这方面提供帮助,或者能为我指出一个好的教程的方向,我将不胜感激。
谢谢

无需任何功能。如果SELECT语句返回要插入的结果,则可以直接将其用作insert语句的源:

要获得结果的递增列,可以使用
row\u number()
函数。我不会存储
st
前缀-如果对所有行都应用该前缀,那只会浪费空间。您可以稍后在视图中或在用于从理货表检索的select语句中轻松地将其合并:

insert INTO salestally(stId, stTotal, spId, stMonth)
SELECT row_number() over (order by extract(month from saledate)),
       SUM(saletotal), 
       spid, 
       extract(month from saledate)
FROM public.sales
GROUP BY spid, extract(month from saledate);
我也不会将月份存储为名称,而是存储为数字。这样,您可以在显示月份时格式化后者