sql - PostgreSQL 函数进行计算然后填充表
问题描述
我正在寻求有关我在 pgAdmin 4 中尝试执行的过程的一些帮助。我有一个名为“sales”的表。属性是;saleId (主键), saleUnitprice (INT), saleQuantity (INT), saleTotal (INT), saleDate (DATE), prId (products表的外键), spId (salesperson表的外键)
我有第二张表,名为“saletally”,我希望用每个销售人员每月的总销售额来填充它。
获取总数的 SQL 是
SELECT spid,
SUM(saletotal)
FROM public."sales"
WHERE EXTRACT(MONTH from saledate) = EXTRACT(MONTH from current_date)
GROUP BY spid;
这将返回每个销售人员的许多记录及其当月的总销售额。我试图弄清楚如何将该信息放在“销售”表中。
我希望最终得到
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_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);
我也不会将月份存储为名称,而是存储为数字。这样,您可以在显示月份时格式化后者。
推荐阅读
- angular - 因为我更新了 package.json 中的 ngx-store 版本。发生错误:
- c# - 从托管类 C#/CLI 访问非托管静态成员(本机 C++)
- javascript - 传递参数以获取请求
- excel - 格式化一个可以用千位分隔符可变四舍五入的数字
- sql - 如何在特定列上分组时获取 MAX ID?
- django - Django REST Framework - 空请求正文
- python - 与 tensorflow 模块相关的问题 -ModuleNotFoundError: No module named 'tensorflow.contrib.rnn.python.ops.core_rnn'
- laravel - 如何检查文件是否在laravel中上传
- go - 从返回元组的函数初始化结构
- python - 循环遍历多个级别的子文件夹并将 csv.gz 文件转换为 csv