在Postgres中,如何在同一查询中计算和查询,然后对结果进行数学运算?

时间:2019-01-05 20:21:41

标签: sql postgresql postgresql-9.3

我有一个庞大的SALES_ORDERS数据库,我需要确定SELLING_AGENT中每个ORDER中的百分比。

学习postgresql,这只是一个示例,它包含约50万行数据。每个ORDER#可以由数十个SALE_ITEM组成(但只能由'SALE_ITEM_1''SALE_ITEM_2'组成。)

我认为我可以尝试执行SUM SELECT这样的操作:

    SELECT (SUM(sale_item_1)+sum(sale_item_2)) as total_person_sale
    FROM SALES_ORDER
    WHERE orderNumber LIKE orderNumber
    GROUP by SELLING_AGENT

但是很明显,我不理解使用WHERE语句来计算相似次数

希望填写最后一栏,如下所示: 销售代理:

    selling agent:  Order#  Sale_item_1 Sale_item_2 %_of_TOTAL_order
    jim              abc    $1.00       $2.00       14.29%
    steve            abc    $3.00       $4.00       33.33%
    carl             abc    $5.00       $6.00       52.38%
    carl             def    $7.00       $8.00       31.25%
    steve            def    $9.00       $9.00       37.50%
    jim              def    $8.00       $7.00       31.25%
    steve            ghi    $6.00       $5.00       61.11%
    patty            ghi    $4.00       $3.00       38.89%

2 个答案:

答案 0 :(得分:1)

您正在尝试做一些高级的事情。我给你两个选择:

SELECT selling_agent, orderNumber,
    sum(sale_item_1) as sale_item_1,
    sum(sale_item_2) as sale_item_2,
    (sum(sale_item_1) + sum(sale_item_2)) * 100.00 /
        sum(sum(sale_item_1) + sum(sale_item_2)) over (partition by orderNumber) as orderPercentage
FROM sales_db
--WHERE orderNumber LIKE orderNumber /* I'm not sure what this is about */
GROUP by orderNumber, selling_agent
ORDER BY orderNumber, selling_agent

这是通过子查询的旧方法:

SELECT selling_agent, orderNumber,
    sum(sale_item_1) as sale_item_1,
    sum(sale_item_2) as sale_item_2,
    (sum(sale_item_1) + sum(sale_item_2)) * 100.00 /
        (
        select sum(sale_item_1 + sale_item_2)
        from sales_db s2
        where s2.orderNumber = s.orderNumber
        )
FROM sales_db s
--WHERE orderNumber LIKE orderNumber
GROUP by orderNumber, selling_agent
ORDER BY orderNumber, selling_agent

顺便说一句,如果每个订单号每个代理商只代表一次,则可以简化一下。

答案 1 :(得分:0)

类似这样的东西:

SELECT 
  s.*, 
  ROUND (
  100.00 * (s.sale_item_1 + s.sale_item_2) /
  (SELECT 
     SUM(sale_item_1 + sale_item_2)
     FROM sales_db 
     WHERE orderNumber = s.orderNumber), 2) percentage
FROM sales_db s;

请参见demo