Функция PostgreSQL для расчета и заполнения таблицы - PullRequest
0 голосов
/ 02 декабря 2018

Мне нужна помощь с процессом, который я пытаюсь выполнить в pgAdmin 4. У меня есть таблица под названием «продажи».Атрибуты есть;saleId (первичный ключ), saleUnitprice (INT), saleQuantity (INT), saleTotal (INT), saleDate (DATE), prId (внешний ключ к таблице продуктов), spId (внешний ключ к таблице продавца)

Iу меня есть вторая таблица 'saletally', которую я собираюсь заполнить данными об общем объеме продаж в месяц на одного продавца.

SQL для получения итогов:

SELECT spid, 
       SUM(saletotal) 
FROM public."sales" 
WHERE EXTRACT(MONTH from saledate) = EXTRACT(MONTH from current_date) 
GROUP BY spid;

Это возвращает числозаписи для каждого продавца и их общий объем продаж за этот месяц.Я пытаюсь выяснить, как поместить эту информацию в таблицу 'saleally'.

Я хочу закончить с

 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;

Я думаю, что где-то должен быть цикл.Я был бы признателен, если кто-то может помочь с этим или может указать мне направление хорошего учебника.Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Никаких функций не требуется.Если ваш оператор SELECT возвращает результат, который вы хотите вставить, вы можете использовать его непосредственно в качестве источника для оператора INSERT:

Чтобы получить увеличивающийся столбец с вашим результатом, вы можете использовать функцию row_number().Я бы не стал хранить префикс st - если его применять ко всем строкам, это просто пустая трата места.Вы можете легко констатировать, что позже в представлении или в операторе выбора, который вы используете для извлечения из таблицы подсчета:

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);

Я бы также не сохранял месяц как имя, а как число.Таким образом, вы можете отформатировать последний при отображении месяца.

...