如何从 Postrgresql 中的存储函数返回多个值

问题描述

我正在使用 Postgresql 并且我是存储函数的新手。我希望我的存储函数返回多列。

以下输入反映了原始表的列,该表存储来自不同用户的数据(例如 clicks_a、clicks_b、clicks_c、cost_a、cost_b、cost_c 等)。

输入:点击次数、成本、预订量、booking_rev

所需的输出

month | ttt_group | cpc | monthly_clicks_mln | cvr | margin_per_conversion | monthly_profit | break_even_cpc | ideal_ccp

我编写了以下代码,但出现此错误

错误:对“market_segment”列的引用不明确。

代码

CREATE OR REPLACE FUNCTION user_performance
     (clicks CHaraCTER varying,cost CHaraCTER varying,bookings CHaraCTER varying,booking_rev CHaraCTER varying)
RETURNS table(month DOUBLE PRECISION,market_segment CHaraCTER varying,cpc TEXT,monthly_clicks_mln NUMERIC(10,3),cvr TEXT,margin_per_conversion TEXT,monthly_profit MONEY,break_even_cpc TEXT,ideal_ccp TEXT)
AS $BODY$

BEGIN

WITH monthly_activity AS (
    SELECT EXTRACT(MONTH FROM date) AS month,market_segment,CASE WHEN clicks = 'clicks_a' THEN SUM(clicks_a)
             WHEN clicks = 'clicks_b' THEN SUM(clicks_b)
             WHEN clicks = 'clicks_c' THEN SUM(clicks_c)
        END AS monthly_clicks,CASE WHEN cost = 'cost_a' THEN SUM(cost_a)
             WHEN cost = 'cost_a' THEN SUM(cost_b)
             WHEN cost = 'cost_a' THEN SUM(cost_c)
        END AS monthly_cost,CAST(CASE WHEN cost = 'cost_a' AND clicks = 'clicks_a'
             THEN (SUM(cost_a) :: FLOAT /SUM(clicks_a) :: FLOAT)
                  WHEN cost = 'cost_b' AND clicks = 'clicks_b'
             THEN (SUM(cost_b) :: FLOAT /SUM(clicks_b) :: FLOAT)
                  WHEN cost = 'cost_c' AND clicks = 'clicks_c'
             THEN (SUM(cost_c) :: FLOAT /SUM(clicks_c) :: FLOAT)
        END AS DECIMAL(5,4)) AS cpc,CASE WHEN bookings = 'bookings_a' THEN SUM(bookings_a)
             WHEN bookings = 'bookings_b' THEN sum(bookings_b)
             WHEN bookings = 'bookings_c' THEN sum(bookings_c)
        END AS monthly_bookings,CASE WHEN booking_rev = 'booking_rev_a' THEN SUM(booking_rev_a)*15/100
             WHEN booking_rev = 'booking_reb_b' THEN SUM(booking_rev_b)*15/100
             WHEN booking_rev = 'booking_reb_c' THEN SUM(booking_rev_c)*15/100
        END AS monthly_margin
    FROM master_table_2019
    GROUP BY month,market_segment
    ORDER BY month
),adv_metrics AS (
    SELECT 
        month,CAST(AVG(cpc) AS DECIMAL(10,3)) AS cpc,CAST(AVG(monthly_clicks)/1000000.0 AS DECIMAL(10,3)) AS monthly_clicks_mln,CAST(MAX(100.0*monthly_bookings :: FLOAT /monthly_clicks :: FLOAT) AS DECIMAL(3,2)) AS cvr,CAST(AVG(monthly_margin :: FLOAT /monthly_bookings :: FLOAT) AS DECIMAL(10,3)) AS margin_per_conversion,MAX(monthly_margin - monthly_cost) AS monthly_profit

    FROM monthly_activity
    GROUP BY month,market_segment
    ORDER BY month
)

SELECT
    month,CONCAT(cpc,' €') AS cpc,monthly_clicks_mln,CONCAT(cvr,'%') AS cvr,CONCAT(margin_per_conversion,' €') AS margin_per_conversion,MONEY(monthly_profit) AS monthly_profit,CONCAT(CAST((margin_per_conversion * cvr/100.0) AS DECIMAL(4,3)),' €') AS break_even_cpc,CONCAT(CAST((margin_per_conversion * cvr/100.0)*0.85 AS DECIMAL(4,' €') AS ideal_ccp 
FROM adv_metrics
ORDER BY month,market_segment;

END; 
$BODY$ LANGUAGE plpgsql;

SELECT * FROM user_performance('clicks_a','cost_a','bookings_a','booking_rev_a')

如何修复此代码并使其正常工作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...