group by 语句期间行值之间的数学运算

math operations between row values during group by statement

在这个 中,我试图按照目前的方式对我的产品进行分组。

现在我尝试将我查询的所有产品与所有已售产品的总和以及每种情况下的平均价格分组,结果如下:

这是我的查询:

select 
        missions_answer.response_id as Response,
        crm_player."document" as Document,
        MAX(missions_answerselectmultiple.body::json ->> 'name') FILTER (WHERE missions_question.label = 'Producto') as Product,
        MAX(missions_answerinteger.body) FILTER (WHERE missions_question.label = 'Cantidad unidades vendidas') as Amount,
        MAX(missions_answerinteger.body) FILTER (WHERE missions_question.label = 'Valor Unidad') as Price
from missions_answer 
    left join missions_question on missions_answer.question_id = missions_question.id 
    left join missions_answertext on missions_answer.id = missions_answertext.answer_ptr_id 
    left join missions_answerselectmultiple on missions_answer.id = missions_answerselectmultiple.answer_ptr_id
    left join missions_answerinteger on missions_answer.id = missions_answerinteger.answer_ptr_id 
    left join missions_response on missions_answer.response_id = missions_response.id
    left join crm_player on missions_response.player_id = crm_player.id
    LEFT JOIN crm_user ON crm_player.user_id = crm_user.id
    group by Response, Document

我想得到这样的东西:

+ ----------------------- + ---------- + ---------- + 
-       product           + total_sold + mean_price +
+ ----------------------- + ---------- + ---------- + 
+ Perfiles- Esquinera.... +    669.000 +    2.500   +
+ Traslucent...           +   900.000  +    30.000  +

以此类推 table 中的所有产品,事实是我无法将所有价格乘以分组期间的金额相加,也无法计算每个产品案例的平均价格table.

我正在尝试这个:

select 
        MAX(missions_answerselectmultiple.body::json ->> 'name') FILTER (WHERE missions_question.label = 'Producto') as Product,
        MAX(missions_answerinteger.body) FILTER (WHERE missions_question.label = 'Cantidad unidades vendidas') as Amount,
        MAX(missions_answerinteger.body) FILTER (WHERE missions_question.label = 'Valor Unidad') as Price,
        sum( (MAX(missions_answerinteger.body) FILTER (WHERE missions_question.label = 'Valor Unidad')) * (MAX(missions_answerinteger.body) FILTER (WHERE missions_question.label )= 'Cantidad unidades vendidas')  ) as Total
from missions_answer 
    left join missions_question on missions_answer.question_id = missions_question.id 
    left join missions_answertext on missions_answer.id = missions_answertext.answer_ptr_id 
    left join missions_answerselectmultiple on missions_answer.id = missions_answerselectmultiple.answer_ptr_id
    left join missions_answerinteger on missions_answer.id = missions_answerinteger.answer_ptr_id 
    left join missions_response on missions_answer.response_id = missions_response.id
    left join crm_player on missions_response.player_id = crm_player.id
    LEFT JOIN crm_user ON crm_player.user_id = crm_user.id
    group by Product

但是我明白了

SQL Error [42803]: ERROR: aggregate function calls cannot be nested

希望有人能帮助我,在此先感谢您的任何提示或帮助。

我认为您需要另一个聚合级别:

select product, sum(amount) as total_sold, avg(price) as mean_price
from (
    select 
        ma.response_id as response,
        cp."document" as document,
        max(mas.body::json ->> 'name') filter(where mq.label = 'Producto') as Product,
        max(mai.body) filter(where mq.label = 'Cantidad unidades vendidas') as Amount,
        MAX(mai.body) filter(where mq.label = 'Valor Unidad') as Price
    from missions_answer ma
    left join missions_question             mq  on ma.question_id = mq.id 
    left join missions_answertext           mat on ma.id = mat.answer_ptr_id 
    left join missions_answerselectmultiple mas on ma.id = mas.answer_ptr_id
    left join missions_answerinteger        mai on ma.id = mai.answer_ptr_id 
    left join missions_response             mr  on ma.response_id = mr.id
    left join crm_player                    cp  on mr.player_id = cp.id
    left join crm_user                      cu  on cp.user_id = cu.id
    group by response, document
) t
group by product

请注意,我将查询更改为对所有 table 使用 table 别名;这缩短了代码,并使其更容易理解。