我正在尝试在pgAdmin 4中尝试执行的过程中寻求帮助。我有一个名为“ sales”的表。 属性是; saleId(主键),saleUnitprice(INT),saleQuantity(INT),saleTotal(INT),saleDate(DATE),prId(产品表的外键),spId(销售员表的外键)
我还有第二个表叫做“ 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;
我认为那里需要一个循环。如果有人可以提供帮助或为我提供指导,我将不胜感激。 谢谢
答案 0 :(得分:2)
不需要任何功能。如果您的SELECT语句返回要插入的结果,则可以将其直接用作INSERT语句的源:
要获得结果的递增列,可以使用row_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);
我也不会将月份存储为名称,而是存储为数字。这样,您可以在显示月份时格式化后者。