Мне нужно создать функцию SINGLE, которая просматривает две разные таблицы (созданные из объединения других таблиц) BRANDS_TYPES и PRODUCTS_LAUNCH. Они имеют следующую структуру.
| id | brand_name | type |
| 1 | porsche | sports |
| 1 | porsche | suvs |
| id | brand_name | prod | prod_date | sales | group | prod_remain |
| 1 | porsche | carrera | 1991 | 500000 | 1 | 5 |
Мне нужно вернуть таблицу, содержащую марки в top x sales для выбранного типа из одна группа . Бренды должны иметь как минимум 1 запуск продукта с выбранной даты . Таблица возврата должна содержать сумму продаж, сгруппированных по брендам и упорядоченных по продажам И брендам с наименьшим количеством оставшихся продуктов. Я не могу понять, как объединить эти различные запросы в одну функцию.
Мне удалось разделить «процедуру» на три разные части, поскольку они не слишком сложны дляначинающий (я). Первая функция получает все бренды, которые имеют определенный тип. Второй просматривает PRODUCTS_LAUNCH и возвращает бренды, которые выпустили как минимум 1 продукт после определенной даты и принадлежат к определенной группе. Третья функция просматривает PRODUCTS_LAUNCH и возвращает таблицу с ранжированным порядком брендов с наименьшим количеством оставшихся продуктов и большинством продаж.
CREATE OR REPLACE FUNCTION get_type (type_choice VARCHAR)
RETURNS TABLE (
g_type_name brands_types.type%TYPE,
g_brand_id brands_types.brand_id%TYPE,
g_brand_name brands_types.brand_name%TYPE)
AS $$
BEGIN
RETURN QUERY SELECT
type_name,
brand_id,
brand_name
FROM brands_types WHERE type ILIKE type_choice;
END; $$
CREATE OR REPLACE FUNCTION get_group_date (cutoff_date DATE, group_choice INT)
RETURNS TABLE (
r_brand_name products_launch.brand_name%TYPE,
r_date_l products_launch.prod_date%TYPE,
r_sales products_launch.sales%TYPE,
r_group products_launch.group%TYPE,
r_remaining products_launch.prod_remain%TYPE)
AS $$
DECLARE
i_row record;
BEGIN
FOR i_row IN
(SELECT
brand_name,
prod_date,
sales,
group,
prod_remain
FROM
products_launch
WHERE prod_date >= cutoff_date AND group = group_choice)
LOOP
r_brand_name := upper(i_row.brand_name);
r_date_l := i_row.prod_date;
r_sales := i_row.sales;
r_group := i_row.group;
r_remaining := i_row.prod_remain;
RETURN NEXT;
END LOOP;
END;
$$
CREATE OR REPLACE FUNCTION get_topsales_prodleft (top_t1 INT)
RETURNS TABLE (
tp_brand_name products_launch.brand_name%TYPE,
tp_remaining products_launch.prod_remain%TYPE,
tp_sales products_launch.sales%TYPE
)
AS $$
BEGIN
RETURN QUERY
SELECT
brand_name,
prod_remain,
SUM (sales) AS total_sales
FROM
products_launch
GROUP BY
brand_name,
prod_remain
ORDER BY prod_remain DESC, total_sales DESC
LIMIT top_t1;
END;
$$
Каждая функцияработает как задумано (я думаю) однако мне нужно иметь одну функцию. Как я могу позвонить один внутри другого и получить запрос на его возврат?