【问题标题】:PostgreSQL function to do calculation and then populate a tablePostgreSQL 函数进行计算然后填充表
【发布时间】:2018-12-02 20:49:55
【问题描述】:

我正在寻求有关我在 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;

我认为那里需要有一个循环。如果有人可以提供帮助或者可以为我指出一个好的教程的方向,我将不胜感激。 谢谢

【问题讨论】:

    标签: sql postgresql plpgsql


    【解决方案1】:

    不需要任何功能。如果您的 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);
    

    我也不会将月份存储为名称,而是存储为数字。这样,您可以在显示月份时格式化后者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多