PostgreSQL函数做计算然后填充一个table
PostgreSQL function to do calculation and then populate a table
我正在寻求有关我在 pgAdmin 4 中尝试执行的流程的帮助。我有一个 table 称为“销售”。
属性是;
saleId(主键)、saleUnitprice(INT)、saleQuantity(INT)、saleTotal(INT)、saleDate(DATE)、prId(产品外键table)、spId(销售员外键table )
我有第二个 table 叫做“saletally”,我希望用每个销售人员每月的总销售额来填充它。
获得总数的SQL是
SELECT spid,
SUM(saletotal)
FROM public."sales"
WHERE EXTRACT(MONTH from saledate) = EXTRACT(MONTH from current_date)
GROUP BY spid;
这 return 每个销售人员的一些记录以及他们当月的总销售额。我正在尝试弄清楚如何将该信息放入“saletally”table。
我希望以
结束
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 语句 returns 是您要插入的结果,您可以直接将其用作 INSERT 语句的来源:
要获得包含结果的递增列,您可以使用 row_number()
函数。我不会存储 st
前缀 - 如果应该将其应用于所有行,那简直就是浪费 space。您可以稍后在视图中或用于从计数 table:
检索的 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);
我也不会将月份存储为名称,而是存储为数字。这样你就可以在显示月份时格式化后者。
我正在寻求有关我在 pgAdmin 4 中尝试执行的流程的帮助。我有一个 table 称为“销售”。 属性是; saleId(主键)、saleUnitprice(INT)、saleQuantity(INT)、saleTotal(INT)、saleDate(DATE)、prId(产品外键table)、spId(销售员外键table )
我有第二个 table 叫做“saletally”,我希望用每个销售人员每月的总销售额来填充它。
获得总数的SQL是
SELECT spid,
SUM(saletotal)
FROM public."sales"
WHERE EXTRACT(MONTH from saledate) = EXTRACT(MONTH from current_date)
GROUP BY spid;
这 return 每个销售人员的一些记录以及他们当月的总销售额。我正在尝试弄清楚如何将该信息放入“saletally”table。
我希望以
结束 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 语句 returns 是您要插入的结果,您可以直接将其用作 INSERT 语句的来源:
要获得包含结果的递增列,您可以使用 row_number()
函数。我不会存储 st
前缀 - 如果应该将其应用于所有行,那简直就是浪费 space。您可以稍后在视图中或用于从计数 table:
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);
我也不会将月份存储为名称,而是存储为数字。这样你就可以在显示月份时格式化后者。